Bei einem Test habe ich folgende Frage bekommen:
Schreiben Sie eine Funktion
f
mit folgendem Typa -> b -> (a -> b)
.a
undb
sollte in keiner Weise gebunden sein, je kürzer der Code, desto besser.
Ich habe es mir ausgedacht f a b = \x -> snd ([a,x],b)
. Kannst du etwas winzigeres finden?
Derzeit ist der Gewinner: f _=(.f).const
code-golf
functional-programming
haskell
Radu Stoenescu
quelle
quelle
f = const const
.f _ b _ = b
, aber angesichts der Lösung in der Frage, ich vermute, ein allgemeinerer Typ ist nicht zulässig.f = id
?f = f
ist eine Lösung, also denke ich, dass die Bedingungen für den Typ sehr wichtig sind!Antworten:
Ihr Beispiel kann verkleinert werden, indem Sie die anonyme Funktion auf der rechten Seite entfernen:
Dies funktioniert, weil der Typ
a -> b -> a -> b
dema -> b -> (a -> b)
in Haskell entspricht.quelle
f a b x = snd (f x,b)
Die Funktion
f _=(.f).const
ist eigentlich allgemeiner alsf :: a -> b -> (a -> b)
, nämlichf :: a -> b -> (c -> b)
. Wenn keine Typensignatur angegeben ist, leitet das Typinferenzsystem einen Typ von abf :: a -> b -> (a -> b)
. Wenn Sie jedoch die Typensignaturf :: a -> b -> (c -> b)
mit genau derselben Definition einfügen, kompiliert Haskell sie ohne Probleme und gibt konsistente Typen für die Teilanwendungen von f aus. Es gibt wahrscheinlich einen tiefen Grund, warum das Typinferenzsystem in diesem Fall strenger ist als das Typprüfsystem, aber ich verstehe nicht genug Kategorietheorie, um einen Grund dafür zu finden, warum dies der Fall sein sollte. Wenn Sie nicht überzeugt sind, können Sie es gerne selbst versuchen.quelle
f a b = f a a
. es folgt daraus, dass es vom Typ ist,a -> a -> b
obwohl es dem Typ entsprichta -> b -> c
. es liegt daran, dassf
es sich nur monomorph verwenden kann, wenn es keinen Typ erhält.In Anbetracht
ScopedTypeVariables
, kam ich mit auf den Punkt :Wenn Sie sowohl meine als auch Ihre Funktion einschränken, ist meine Haarlänge kürzer:
Natürlich dürfen Sie sich wahrscheinlich nicht auf Folgendes verlassen
ScopedTypeVariables
: P.quelle
f _=(.f).const
( aufgrund von Sassa NF ). Welches braucht auch nichtScopedTypeVariables
.