在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 中。使用(:[])purereturn如果您愿意。


以上是在Haskell中返回两个元素列表的函数的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>