2016-09-26 3 views
1

Ich versteht nicht, die Rolle des Dickdarms in dem folgenden Lambda-Ausdruck:Doppelpunkt in einer Lambda-Funktion?

myFunction :: [Int] -> [Int] 
myFunction li = foldr (\x acc -> if x < 10 then x : acc else acc) [last li] li 

Ich bin es gewohnt, den Doppelpunkt für rekursive Aktionen zu sehen, aber es sieht aus wie dieser Doppelpunkt effektiv prepend sagen wird zu aktuelle Akku-Liste, ist das richtig?

+0

Es ist eigentlich ein Vorlauf, kein Append. – redneb

+2

Das ist die Listennotation * *. Nicht viel mit Lambda zu tun. –

+2

kann es mit redundanten Klammern etwas klarer sein, '(\ x acc -> if (x <10) dann (x: acc) else acc)'. –

Antwort

7

: ist ein Datenkonstruktor. Es wird ein Wert vom Typ a einer vorhandenen (möglicherweise leeren) Liste vom Typ [a] vorangestellt.

let x = 1 : [2,3,4] -- x == [1,2,3,4] 

Sie können die Liste Typkonstruktor Bild als wie folgt definiert ist:

data [] a = [] | a : [] a  -- : as an infix operator 
data [] a = [] | (:) a ([] a) -- : in prefix positino 

, die leichter als

-- [] == List 
-- (:) == Cons 
data List a = EmptyList | Cons a (List a) 

Mit „rekursive Aktion“ könnte lesen, ich nehme an, Sie bedeuten Sie sehen, dass es in einer Mustervergleichssituation wie

head (a:as) = a 
verwendet wird

Dies ist nicht einzigartig für (:); Musterabgleich kann mit jeder Datenkonstruktor erfolgen.

Verwandte Themen