使用 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"]

是否可以使用 LambdaCasecase 表达式简化为类似(不编译):

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 解决方案。