2
私はハスケルを学んでいます。これは簡単な例ですが、次の例でlambda関数内でパターンマッチングを使用できない理由を理解したいと思います(filterfoldの 'function running、filterfold'がランタイムエラーをもたらす理由)。ラムダのパターンマッチング
-- Runs
filterfold' :: (a -> Bool) -> [a] -> [a]
filterfold' p zs = foldr (\y zs -> if (p y) then y:zs else zs) [] zs
-- Runtime error: Non-exhaustive patterns in lambda
filterfold :: (a -> Bool) -> [a] -> [a]
filterfold p (z:zs) = foldr (\y (z:zs) -> if (p y) then y:(z:zs) else (z:zs)) [] (z:zs)
したがって、filterfold関数の引数のzsは範囲にありますが、filterfoldの 'z'を使用する代わりに、ラムダの内部でパターンマッチングを実行しようとしますか? – Daniel
はいラムダ内の 'z'と' zs'は異なるものです( 'foldr'はそれらを提供します) - なぜlambda-argumentsのパラメータ/引数名を再使用すべきでないのですか?あなたのラムダは一度外側のスコープから隠すでしょう - もし 'filterfold'の外側のスコープから' z'と 'zs'を(再)使いたいなら' foldr(\ y ys - > ...) '(あるいは' p'、 'z'、' zs'、 'y';と違う名前であれば) – Carsten
ですが、実際には2番目の引数が必要ないあなたが 'foldr'に与えている'関数 '(ラムダ)がなければ、リストの' head'にしか作用しないので、おそらく 'foldr'は必要ありません。 'foldr'の引数 – Carsten