0

使用以下 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会接收三个参数而不是一个元组。我不知道这是否可以做这样的事情。

4

2 回答 2

4

您需要添加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"]
于 2021-05-24T09:43:24.537 回答
1

另一种选择是,由于模式仅在最后一个参数上,所以将前两个与普通 lambda 绑定,最后一个与 lambdacase 绑定:

zipWith3 (\foo bar -> \case
    Just baz -> Right "hell yeah"
    Nothing -> Left "tough luck"
) [] [] []

我个人觉得这在视觉上更令人愉悦,但没有特别的技术理由更喜欢这个或curry3解决方案。

于 2021-05-24T12:42:15.950 回答