什么是在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上找到它。
当然,有一种方法可以简单地将它写成无点(而且这当然是一个有效的答案),但是由于将类型构造函数作为包装函数传递似乎非常有用,所以我觉得奇怪的是我找不到标准函数将值包装到列表中,所以我想我可能会错过一些东西。
答
刚刚找到答案,这要归功于,这与另一个问题有关。写wrapAndG
一个很好的,免费的点对点方式是
wrapAndG = g . return
它使用的事实,名单是Monad
实例。
答
对于列表pure
你想要做什么:
wrapAndG = g . pure
似乎有点显而易见,但运算符部分又如何:'(:[])'。 5个字符,技术上比'pure'更长,但它肯定更好地表达了“创建单例列表”的意图。 – user2407038
事实上,使用'return'或'pure'的解决方案很有趣,因为它们超出了列表的范围,但我同意'(:[])'更好地表示了这种情况下的意图! –
@ user2407038我想我几年前就看到了那个叫做“猴头运算符”的东西。我猜这是相当习惯的。 – chi