问题描述
使用以下 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
解决方案。