2
我正在學習Haskell。這是一個簡單的例子,但我想理解爲什麼我不能在下面的例子中使用lambda函數內部的模式匹配(即,爲什麼filterfold'函數運行但filterfold'給出運行時錯誤):lambda內模式匹配
-- 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',它會嘗試在lambda中本地執行模式匹配? – Daniel
是的lambda中的'z'和'zs'將是不同的('foldr'將提供*它們) - 這就是爲什麼你不應該重複使用lambda參數的參數/參數名 - 你*引入*這些名稱你的lambda會隱藏一次從外部範圍 - 所以如果你想(重新)從'filterfold'的外部範圍使用'z'和'zs',你應該把它重命名爲'foldr(\ y ys - > ...)'(或者任何你喜歡的名字都不同於'p','z','zs'和'y';)) – Carsten
但是請注意:如果你實際上不需要第二個參數函數(lambda)給你'foldr',那麼你可能並不需要'foldr',因爲如果它只是在列表的'head'上操作,如果它不是空的或者默認爲第二個'foldr'的參數 – Carsten