如何使用LambdaCase简化Haskell中带case的zipWith3表达式
可以实现,你写的代码编译失败的核心原因是\case语法生成的是仅接收单个参数的函数,而zipWith3要求传入的函数需要接收3个独立参数,两者参数数量不匹配才会报错。
以下是两种可行的实现方案:
方案1:保留zipWith3,手动打包参数后传入LambdaCase
你可以先把zipWith3传入的三个独立参数手动打包为三元组,再传给用\case定义的单参数匹配函数,写法如下:
{-# LANGUAGE LambdaCase #-} -- 基础写法 zipWith3 (\a b c -> (\case (foo, bar, Just baz) -> Right "hell yeah" (foo, bar, Nothing) -> Left "tough luck" ) (a,b,c) ) ["foo1", "foo2"] ["bar1", "bar2"] [Just "baz1", Just "baz2"] -- 搭配&运算符(需导入Data.Function)逻辑更顺 import Data.Function ((&)) zipWith3 (\a b c -> (a,b,c) & \case (foo, bar, Just baz) -> Right "hell yeah" (foo, bar, Nothing) -> Left "tough luck" ) ["foo1", "foo2"] ["bar1", "bar2"] [Just "baz1", Just "baz2"]
方案2:用zip3+map简化逻辑(更推荐)
你的场景本质是对三个列表对应位置的元素组成的三元组做统一匹配,完全可以先把三个列表用zip3打包为三元组列表,再用map搭配\case处理,代码更简洁直观,和原始代码运行结果完全一致:
{-# LANGUAGE LambdaCase #-} map (\case (foo, bar, Just baz) -> Right "hell yeah" (foo, bar, Nothing) -> Left "tough luck" ) $ zip3 ["foo1", "foo2"] ["bar1", "bar2"] [Just "baz1", Just "baz2"]
内容的提问来源于stack exchange,提问作者Jivan
相关产品推荐
相关产品推荐

