2017-02-19 2 views
-2

ich für einen Test am revidieren, die ich auf Haskell kommen und eine der Fragen ist:Haskell - Geben Typ Erklärung Funktion

(b) Erklärungen geben Typ folgende (möglicherweise unvollständig) in Anspruch nehmen Funktionsdefinitionen:

ii. unzOp ((x,y):zs) = ((x+1):(fst(unzOp zs)),(y+2.5):(snd(unzOp zs)))

Kann jemand mir helfen, diese Frage bitte zu beantworten? Wenn Sie die Frage, warum die Antwort das ist, aufschlüsseln könnten, wäre das sehr zu begrüßen.

Danke

+0

Wie weit sind Sie gekommen? Wo steckst du fest? – melpomene

Antwort

2

Zuerst die „Form“ der Daten zu identifizieren sind. Sie können dies tun, indem Sie nach Konstruktoren suchen. Hier haben Sie (:), Konstruktor für die Liste und (,), Konstruktor für Tupel. Sie können ableiten, dass die Art, die Form hat

unzOp :: [(a, b)] -> ([a], [b]) 

Dann können Sie für mehr Constraints auf a und b aussehen. Wegen x+1 müssen Sie davon ausgehen, dass x eine Nummer ist. Wegen y+2.5, müssen Sie davon ausgehen, y ist eine Zahl zu, aber Bruchteil.

So

unzOp :: (Num a, Fractional b) => [(a, b)] -> ([a], [b]) 

Um ehrlich zu sein, die numerischen Typen sind nicht die einfachste Sache in Haskell. Sie können den Typ eines Ausdrucks mit :t in ghci fragen.

:t (\x -> x + 1) 
(\x -> x + 1) :: Num a => a -> a 

By the way, was passiert, wenn Sie eine leere Liste zu unzOp passieren?

Oder mit anderen Worten, unzOp ist rekursiv definiert, aber was ist der Grundfall?