だから私は私のリストから、「n」は最初の要素、「(B:BS)を得、この関数を作成した。関数take6エラーの非網羅的なパターン?
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)
問題は、私がしようとしたときということです:take6 2 []
、それは示しています
*** Exception: sexta.hs:(4,1)-(6,15): Non-exhaustive patterns in function take6
私は私が手でこれをしようとすると、cuzのは、なぜいけない:。
take6 2 []
= [] ++take6 1 []
= [] ++[]++take6 0 []
= [] ++[]++[]
= []
はい、その潜在的に、より効率的な先頭に追加するためのより効率的な方法ということが気にし、再び「短所」コンストラクタを使用しています。しかし、最適化を有効にしてGHCを実行すると、それらは同じになるはずです。私はこの例をチェックしていませんが、リテラルリストを 'build'フォームに置く特別なルールがあります。これは'(++) 'の' foldr'フォームと融合するべきです。この場合、この最適化に依存する点はありませんが、 '[a]'を 'foldMap'のモノオイドターゲットとして使用すると、より重要と思われます。 – dfeuer