使用 LambdaCase 简化 zipWith 和大小写

Simplify zipWith and case using LambdaCase

使用以下 zipWith 表达式:

zipWith3 (\foos bars bazs -> case (foos, bars, bazs) of
    (foo, bar, Just baz)  -> Right "hell yeah"
    (foo, bar, Nothing) -> Left "tough luck"
) ["foo1", "foo2"] ["bar1", "bar2"] [Just "baz1", Just "baz2"]

是否可以使用 LambdaCase 来简化 case 表达式(不编译):

zipWith3 (\case
    (foo, bar, Just baz)  -> Right "hell yeah"
    (foo, bar, Nothing) -> Left "tough luck"
) ["foo1", "foo2"] ["bar1", "bar2"] [Just "baz1", Just "baz2"]

在第一个(工作)版本中,case 接收一个元组,但在(失败的)LambdaCase 版本中,case 似乎会接收三个参数而不是一个元组。我不知道这样做是否可行。

您需要添加curry3(例如来自extra包):

zipWith3 (curry3 $ \case
    (foo, bar, Just baz)  -> Right "hell yeah"
    (foo, bar, 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 解决方案。