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