在Haskell中返回两个元素列表的函数
有没有一种简洁的方法可以在(x y -> x:y:[])不使用 lambda 的情况下用Haskell 编写函数?例如,(:[])比(x -> [x])or优雅得多(x -> x:[])。
回答
你可以用一些标准的技巧来自己制作它:写操作符前缀使应用程序顺序更明显,用于flip将参数移动到末尾,并(.)传递结果。所以:
x y -> x:y:[]
= { prefix }
x y -> (:) x ((:) y [])
= { move last argument to end of return value }
x y -> (:) x (flip (:) [] y)
= { pass through results }
x -> (:) x . flip (:) []
= { prefix }
x -> (.) ((:) x) (flip (:) [])
= { move last argument to end of return value }
x -> flip (.) (flip (:) []) ((:) x)
= { pass through results }
flip (.) (flip (:) []) . (:)
如果您愿意,可以使用部分使最后一个稍微更地道:
= { elide flip using sections }
(. (:[])) . (:)
这些都不是特别简洁。在我看来,它们的可读性也明显低于x y -> [x,y].
回答
其他答案涵盖了更直接的方法,但我想建议
(++) `on` singleton
这很短,但仍然很容易理解。
对我来说singleton是最易读的,但请注意,它不在 Haskell 报告中,并且仅在基础 4.14 后才出现在 GHC 中。使用(:[])或pure或return如果您愿意。