2017-05-13 2 views
0

Ich möchte eine Funktion erstellen, machen wir es altHead nennen, die zwei Variablen nimmt und gibt eine Variable, so dass:Passing zwei Argumente von unterschiedlichen Typen

a -> [a] -> a 

ich es so nennen wollen:

altHead 3 [1,2,3,4] 

Was es tun soll, ist die erste Variable und die Liste zu sehen. Wenn die Liste leer ist, geben Sie den Wert der ersten Variablen zurück. Andernfalls geben Sie die Liste zurück.

In diesem Fall habe ich den folgenden Code geschrieben.

altHead :: a -> [a] -> a 
altHead (x:xs) = if null[xs] then [x] else [xs] 

Allerdings glaube ich, dass x: xs nur durch die Liste schaut.

Ich bin ein bisschen fest, wie man das ändert, so dass es auch auf den ersten Wert schaut, und wie man den ersten Wert in die Funktion einbezieht.

+2

Hinweis: Benutzen Sie nicht if/then/else überhaupt. Mustervergleich ist alles was Sie brauchen. – Carl

+0

@Carl Hmmm so, altHead [] = x //// altHead [a] = [a]? –

+1

'(x: xs)' bindet nicht zwei Argumente, es bindet den Kopf und das Ende eines * einzigen * Arguments, das eine Liste sein muss. – Wyzard

Antwort

3

Sie wollen so etwas wie:

altHead :: a -> [a] -> a 
altHead a xs = if null xs then a else head xs 

oder alternativ Muster auf der Liste passend mit:

altHead :: a -> [a] -> a 
altHead a [] = a 
altHead a (x:xs) = x 
+0

Die letzte Zeile des zweiten Beispiels kann auch 'altHead _ (x: _) = x 'geschrieben werden, da weder' a' noch 'xs' tatsächlich verwendet werden. – Wyzard

+0

Ja, ich dachte nur, es half Lesbarkeit/Verständnis, sie als Variablen Namen zu verlassen. (Es zeigt auch das '(x: xs)' Muster, das das OP verwendet hat.) – zbw

+1

Ich glaube, ich verstehe jetzt etwas, was ich zuvor grundlegend verstanden hatte. Danke dafür, sah es genauso, wie ich meine Version beendet hatte, und es war ein bisschen daneben, aber ansonsten ok. Quick F: Mir ist klar, dass das Tippen nicht normal funktioniert, aber ist es möglich, dass es die gesamte LIST zurückgibt, wenn es nicht leer ist, aber sonst nur x zurückgibt? –

Verwandte Themen