繁体   English   中英

Haskell中的闭包和列表推导

[英]Closures and list comprehensions in Haskell

我此刻正在玩Haskell,因此偶然发现了列表理解功能。 当然,我会用一个闭包来做这种事情:

Prelude> [x|x<-[1..7],x>4] -- list comprehension
[5,6,7]
Prelude> filter (\x->x>4) [1..7] -- closure
[5,6,7]

我仍然感觉不到这种语言,那么Haskell程序员会采用哪种方式? 这两种解决方案有什么区别?

惯用的Haskell将是filter (> 4) [1..7]

请注意,您没有捕获闭包中的任何词法范围,而是使用分段运算符。 也就是说,您需要部分应用> ,哪些操作员部分会立即为您提供。 列表理解有时是有吸引力的,但通常的看法是它们不像通常的高阶函数套件那样精确地缩放(对于更复杂的组合,“缩放”)。 当然,这种风格决定在很大程度上是主观的,所以YMMV。

如果元素有点复杂并且需要通过模式匹配来过滤它们,或者映射部分对于lambda抽象感觉过于复杂(这应该很短(或者我觉得)),或者如果必须处理,那么列表推导会派上用场使用嵌套列表。 在后一种情况下,列表理解通常比替代方案更具可读性(无论如何)。

例如:

[ (f b, (g . fst) a) | (Just a, Right bs) <- somelist, a `notElem` bs, (_, b) <- bs ]

但是对于你的例子,部分(>4)是一种非常好的写入方式(\\a -> a > 4) ,因为你只使用它进行过滤,大多数人都更喜欢ANthonys解决方案。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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