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

问题描述:

简写:有没有更习惯写法(\a->[a])什么是在Haskell中引用单例列表构造函数的惯用方法?

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

wrapAndF a = f $ Foo a 

...我可以使它指向*写

wrapAndF = f . Foo 

但如果我的功能g :: [a] -> b上列出工作和我的包装看起来像这样...

wrapAndG a = g [a] 

...什么是最无意义的写作方式?我知道我可以写一个明确的λ:

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

或镜像使用构造中富例如,使用列表构造(:),但后来我不得不翻转参数:

wrapAndG = g . flip (:) [] 

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

当然,有一种方法可以简单地将它写成无点(而且这当然是一个有效的答案),但是由于将类型构造函数作为包装函数传递似乎非常有用,所以我觉得奇怪的是我找不到标准函数将值包装到列表中,所以我想我可能会错过一些东西。

+5

似乎有点显而易见,但运算符部分又如何:'(:[])'。 5个字符,技术上比'pure'更长,但它肯定更好地表达了“创建单例列表”的意图。 – user2407038

+1

事实上,使用'return'或'pure'的解决方案很有趣,因为它们超出了列表的范围,但我同意'(:[])'更好地表示了这种情况下的意图! –

+2

@ user2407038我想我几年前就看到了那个叫做“猴头运算符”的东西。我猜这是相当习惯的。 – chi

呼应comments通过user2407038和卡,(:[])是拼写错误的一个好方法,如果你想具体到列表中的内容:

wrapAndG = g . (:[]) 

刚刚找到答案,这要归功于,这与另一个问题有关。写wrapAndG一个很好的,免费的点对点方式是

wrapAndG = g . return 

它使用的事实,名单是Monad实例。

对于列表pure你想要做什么:

wrapAndG = g . pure