Also habe ich diese Funktion, um mir die "n" ersten Elemente aus einer Liste "(b: bs);Nicht erschöpfende Muster in der Funktion take6 error?
1 module Sexta where
2
3 take6::Int->[a]->[a]
4 take6 n (b:bs) = if n<=0 then []
5 else [b] ++ (take6 (n-1) bs)
Das Problem, das ist, wenn ich versuche: take6 2 []
, es zeigt:
*** Exception: sexta.hs:(4,1)-(6,15): Non-exhaustive patterns in function take6
ich nicht, warum, cuz, wenn ich versuchen, diese von Hand.
take6 2 []
= [] ++take6 1 []
= [] ++[]++take6 0 []
= [] ++[]++[]
= []
Ja, es ist möglicherweise effizienter. Wenn GHC jedoch mit aktivierten Optimierungen ausgeführt wird, sollten sie identisch sein. Ich habe dieses Beispiel nicht überprüft, aber es gibt spezielle Regeln, um Literallisten in 'Build'-Formen zu entzippen, die mit der' foldr'-Form in '(++)' verschmelzen sollten. In diesem Fall hat es keinen Sinn, sich auf diese Optimierung zu verlassen, aber ich vermute, dass es wichtiger ist, wenn man '[a]' als das Monoid-Ziel einer 'FoldMap' verwendet. – dfeuer