[英]How to use map instead of list comprehension (Haskell)
我制作了这段代码,它替换了满足谓词的列表中的所有元素:
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
| y <- ys
。 我知道这可能是重复的,但我找不到处理这个特定转换的问题。
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 中,变量名称以s
结尾来表示项目的集合(尤其是在使用列表时)。 这里zs
是该列表的一个元素,因此命名变量y
或z
更有意义,而不是 :zs
gRepMap :: (t -> Bool) -> t -> [t] -> [t]
gRepMap pred x ys = map (\y -> if pred y then x else y) ys
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 <- ys
位属于列表理解语法,您不应该将其复制到那里。 相反, y
成为 lambda 参数,而ys
是被映射的列表。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.