2017-03-13 2 views
0

Ich lerne Haskell über Lernen Sie ein Haskell und ich bin mir ziemlich sicher, dass er irgendwann darüber gegangen ist, aber ich kann nicht herausfinden, wo. Angenommen, ich möchte eine Funktion haben, die ein Paar, eine Liste von Paaren oder ein allgemeines Tupel zurückgibt. Wie ist die Typ-Signatur dafür geschrieben? Zum Beispiel möchte ich für eine gegebene gerade Zahl die Liste eindeutiger Paare von Primzahlen, die sich addieren, zurückgeben. Ich habe eine Funktion isPrime, die angibt, ob eine Int eine Primzahl ist oder nicht.Syntax für Funktionen, die Funktionen in Haskell annehmen oder zurückgeben

pairs :: Int -> [(Int a, Int b)] 
pairs n 
    | n < 4 = [] 
    | odd n = [] 
    | otherwise = [(a, b) | a < b, isPrime a, isPrime b, a+b == 1] 

Wenn ich versuche, dies zu kompilieren, bekomme ich den Fehler "Int hat zu wenige Argumente." Also habe ich die folgende Syntax stattdessen versucht:

pairs :: Int -> [((Int a), (Int b))] 

Aber ich habe den gleichen Fehler. Wie funktionieren also Satzfunktionen mit Paaren im Allgemeinen?

+2

Welche zwei Primzahlen addiert sich zu 1? – chepner

+0

Siehe http://learnyouahaskell.com/making-our-own-types-and-typeclasses#kinds-and-some-type-foo – Yawar

+0

@chepner 3 und -2, natürlich. –

Antwort

4

Ihr Problem besteht nicht in der Formatierung. Int a und Int b sind krankhaft. Int kann nicht angewendet werden, da es sich nicht um eine (type-level) Funktion handelt. Sie wollen nur Int -> [(Int, Int)].

Verwandte Themen