繁体   English   中英

如何使用地图而不是列表理解(Haskell)

[英]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是该列表的一个元素,因此命名变量yz更有意义,而不是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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM