Ich versuche, die folgende Karte als Haskell Funktion zum Ausdruck bringen:Haskell: a -> a -> ... -> b [a] -> b
Gegeben seien zwei Arten a, b
die Familie betrachten Funktionen F(a, b)
von Funktionen der Art, die aus
f :: a -> a -> ... -> a -> b
mit n
Wiederholungen a
, wo n
eine ganze Zahl größer als Null ist. Was ich will, ist jede Funktion f
in F(a, b)
auf eine Funktion zur Karte f' :: [a] -> b
, so dass f x1 x2 ... xr = f' [x1, ..., xr]
, wo r
kleiner ist als die Anzahl der Argumente ist f
nimmt (das heißt ich bin für die Funktion der Suche listify :: F(a, b) -> ([a] -> b)
). Wenn es mehr Elemente als f
Argumente verwendet, sollten die zusätzlichen Elemente verworfen werden:
f :: a -> a -> b
(listify f xs) == (listify f $ take 2 xs)
Außerdem, wenn die leeren kotierten übergeben wird, wird jeder Wert akzeptabel ist.
Ich bin natürlich in der Lage, diese Karte für Funktionen mit einer festen Anzahl von Argumenten zu implementieren (zum Beispiel: listify :: (a -> a -> b) -> ([a] -> b)
, etc.), aber ich konnte keinen Weg finden, eine Funktion zu schreiben, die es für alle f
tut in F(a, b)
gleichzeitig. Obwohl Template Haskell wahrscheinlich in der Lage ist, mir die richtigen Werkzeuge zur Verfügung zu stellen, interessiert mich eine solche Lösung nicht. Ich möchte etwas pure "Art Magie" finden, um es zu tun.
Weiß jemand, ob das überhaupt möglich ist? Kann mir jemand vielleicht in die richtige Richtung zeigen? Oder ist das ein bekanntes "Problem", das Milliarden Mal gelöst wurde und ich einfach keine Lösung finden kann?
Sie können dies mit einigen "OverlappingInstances" Trickserei (vielleicht sogar mit weniger umstrittenen Erweiterungen) tun, aber ich bezweifle, dass es eine gute Idee ist. Warum benutzen Sie nicht einfach die Funktion zum Akzeptieren von Listen? – leftaroundabout
In Bezug auf "Warum?": Die Frage, ob das möglich ist oder nicht, kam mir in den Kopf -> Ich frage aus pädagogischen Gründen (vielleicht auch etwas neue Haskell-Magie zu lernen, während ich versuche, eine Lösung zu finden). Ich bin ein wenig verwirrt, auf welche "Listen akzeptierende Funktion" Sie verweisen. Ich habe eine Funktion f :: a -> a -> ... a -> b (mit einer unbekannten Zahl von 'a's) und will eine Funktion f' :: [a] -> b, so dass f x1 .. .xr = f '[x1, ...., xr]. Somit habe ich keine Listenannahmefunktion, ich möchte eine! Aber wahrscheinlich habe ich nicht verstanden, was du wirklich meintest. – morris
Was genau würden Sie mit "OverlappingInstances" tun, damit es funktioniert? Ich sehe keinen Weg es zu tun. – morris