在 Haskell 中引用单例列表构造函数的惯用方式是什么?
What is the idiomatic way to refer to a singleton list constructor in Haskell?
缩写形式:有没有更惯用的写法(\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.
上找不到它
当然还有另一种选择,就是不直接编写它(这当然是一个有效的答案),但是由于将类型构造函数作为包装函数传递似乎非常有用,所以我找不到它感觉很奇怪一个将值包装到列表中的标准函数,所以我想我可能遗漏了一些东西。
刚刚找到答案,感谢 pointfree.io,它已链接到另一个问题。 wrapAndG
的一个很好的、无意义的写法是
wrapAndG = g . return
这利用了列表是 Monad
.
的实例这一事实
对于列表 pure
做你想做的:
wrapAndG = g . pure
呼应 user2407038 和 chi 的 ,(:[])
是一种很好的拼写方式,如果您想要特定于列表的内容:
wrapAndG = g . (:[])
缩写形式:有没有更惯用的写法(\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.
当然还有另一种选择,就是不直接编写它(这当然是一个有效的答案),但是由于将类型构造函数作为包装函数传递似乎非常有用,所以我找不到它感觉很奇怪一个将值包装到列表中的标准函数,所以我想我可能遗漏了一些东西。
刚刚找到答案,感谢 pointfree.io,它已链接到另一个问题。 wrapAndG
的一个很好的、无意义的写法是
wrapAndG = g . return
这利用了列表是 Monad
.
对于列表 pure
做你想做的:
wrapAndG = g . pure
呼应 user2407038 和 chi 的 (:[])
是一种很好的拼写方式,如果您想要特定于列表的内容:
wrapAndG = g . (:[])