在Haskell中引用单例列表构造函数的惯用方法是什么?

时间:2017-03-07 23:10:20

标签: haskell idiomatic pointfree

简短形式:是否有更惯用的方式来撰写(\a->[a])

长格式:对于任何数据类型Foo a,如果我有一个函数f :: Foo a -> b,我需要写一些像......

wrapAndF a = f $ Foo a

......我可以通过编写

来使其无点
wrapAndF = f . Foo

但是如果我的函数g :: [a] -> b在列表上运行,我的包装器就像这样......

wrapAndG a = g [a]

...最简单的写点是什么?我知道我可以写一个明确的lambda:

wrapAndG = g . (\x->[x])

或者,在Foo示例中镜像构造函数的使用,使用列表构造函数(:),但是我必须翻转参数:

wrapAndG = g . flip (:) []

...但是引用单例列表构造函数的惯用方法是什么?我希望找到一个带有签名a -> [a]的标准函数,但我在Hoogle或Data.List上找不到它。

当然有一种替代方法,就是不用无点编写它(这当然是一个有效的答案)但是由于将类型构造函数作为包装函数传递似乎非常有用,因此我觉得很难找到标准函数将值包装到列表中,所以我想我可能会遗漏一些东西。

3 个答案:

答案 0 :(得分:10)

对于列表pure做你想做的事:

wrapAndG = g . pure

答案 1 :(得分:10)

如果您需要特定于列表的内容,则可以通过user2407038和chi回应comments(:[])是拼写它的好方法:

wrapAndG = g . (:[])

答案 2 :(得分:3)

刚刚找到答案,感谢here,这与另一个问题相关联。写wrapAndG的一种不错的,无点的方法是

wrapAndG = g . return

这使用列表是Monad的实例。