如何解决使用 LambdaCase 简化 zipWith 和 case
使用以下 zipwith 表达式:
zipwith3 (\foos bars bazs -> case (foos,bars,bazs) of
(foo,bar,Just baz) -> Right "hell yeah"
(foo,nothing) -> Left "tough luck"
) ["foo1","foo2"] ["bar1","bar2"] [Just "baz1",Just "baz2"]
是否可以使用 LambdaCase
将 case
表达式简化为类似(不编译):
zipwith3 (\case
(foo,Just "baz2"]
在第一个(工作)版本中,case
接收一个元组,但在(失败的)LambdaCase 版本中,似乎 case
将接收三个参数而不是一个元组。我不知道这是否可以做这样的事情。
解决方法
您需要添加 curry3(例如,来自 extra
包):
zipWith3 (curry3 $ \case
(foo,bar,Just baz) -> Right "hell yeah"
(foo,Nothing) -> Left "tough luck"
) ["foo1","foo2"] ["bar1","bar2"] [Just "baz1",Just "baz2"]
,
另一种选择,因为模式只在最后一个参数上,是将前两个与普通 lambda 绑定,最后一个与 lambdacase 绑定:
zipWith3 (\foo bar -> \case
Just baz -> Right "hell yeah"
Nothing -> Left "tough luck"
) [] [] []
我个人觉得这在视觉上更令人愉悦,但没有特别的技术理由更喜欢这个或 curry3
解决方案。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。