我制作了這段代碼,它替換了滿足謂詞的串列中的所有元素:
gRep :: (t -> Bool) -> t -> [t] -> [t]
gRep pred x ys = [if pred y then x else y | y <- ys]
所以f.eks我得到這些輸出:
ghci> gRep (<'g') 'z' "abcdefghijklmnopqrstuvwxyz"
"zzzzzzghijklmnopqrstuvwxyz"
ghci> gRep (<3) 0 [1,2,3,4,5,6,7,8,9]
[0,0,3,4,5,6,7,8,9]
如何使用 map 撰寫此函式?
我試著這樣寫:
gRepMap :: (t -> Bool) -> t -> [t] -> [t]
gRepMap pred x ys = map (\zs -> if (pred y) then x else y | y <- ys) ys
但是由于| y <- ys. 我知道這可能是重復的,但我找不到處理這個特定轉換的問題。
uj5u.com熱心網友回復:
Lamba expession\zs -> …中的zs變數是這個變數將使用串列中的元素,因為 lambda 運算式是用 elist 的每個元素呼叫的,因此您可以使用以下方法執行映射:
gRepMap :: (t -> Bool) -> t -> [t] -> [t]
gRepMap pred x ys = map (\zs -> if pred zs then x else zs) ys
通常在 Haskell 中,變數名以 an 結尾s來表示專案的集合(尤其是在使用串列時)。這zs是該串列的一個元素,因此將變數命名為yor z, not更有意義:zs
gRepMap :: (t -> Bool) -> t -> [t] -> [t]
gRepMap pred x ys = map (\y -> if pred y then x else y) ys
uj5u.com熱心網友回復:
gRep pred x ys = [ if (pred y) then x else y | y <- ys]
-- ^^^ ------>>>--.
gRepMap pred x ys = map (\ y -> if (pred y) then x else y ) ys -- |
^^^ <----------<<<--------------<<<-------------*
根據Haskell Report給出的等效翻譯,這就是串列理解輸出部分中的 任何運算式的作業方式,
[ exp | y <- ys ]
===
concatMap (\y -> [exp]) ys
===
map (\y -> exp ) ys
報告給出了一個更一般的翻譯,在不可辯駁的模式的情況下相當于上面的翻譯,就像y這里一樣。
該| y <- ys位屬于串列理解語法,您不應該將其復制到那里。相反,它y成為 lambda 引數,并且ys是被映射的串列。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/322301.html
上一篇:查找串列中重復元素的位置
