Haskell let表达式中的模式匹配
如何从未知构造函数的变量中提取值 例如,我想否定构建为权利的任意if中的值:Haskell let表达式中的模式匹配,haskell,syntax,Haskell,Syntax,如何从未知构造函数的变量中提取值 例如,我想否定构建为权利的任意if中的值: let Right x = getValue in Right (negate x) 这段代码成功地将Right的值(本例中为Int)绑定到x 这是可行的,但是如果getValue返回一个Left呢?有没有办法确定let表达式中变量的类型?或者有更好的方法解决这个问题吗?一般来说,您可以做的是: case getValue of Right x -> Right $ negate x e -&
let Right x = getValue
in Right (negate x)
这段代码成功地将Right的值(本例中为Int)绑定到x
这是可行的,但是如果getValue返回一个Left呢?有没有办法确定let表达式中变量的类型?或者有更好的方法解决这个问题吗?一般来说,您可以做的是:
case getValue of
Right x -> Right $ negate x
e -> e
这一点应该很清楚:它就像函数参数中的模式匹配,但与值相反。为了满足您的需要,您有一个默认的case,它捕获任何不匹配的内容,然后返回该内容
但是,在您的特定情况下,您可以做一些稍微好一点的事情:
negate `fmap` getValue
或者,使用import Control.Applicative
,您可以使用
作为fmap
的同义词(否定getValue
)。fmap
函数的类型为fmap::Functor f=>(a->b)->fa->fb
。对于任何functor 1,fmap
将普通值上的函数转换为functor内的函数。例如,列表是一个函子,对于列表,fmap=map
。这里,e
表示一个函子,它是一个异常左e
或一个值右a
;将函数应用于左侧
不会产生任何效果,但将函数应用于右侧
会将其应用于右侧
中。换句话说,
instance Functor (Either e) where
fmap _ (Left l) = Left l
fmap f (Right r) = Right $ f r
因此,案例
版本是您问题的直接答案,但您的特定示例更接近于fmap
1:根据一级近似,函子是“容器”。如果您不熟悉各种类型的类,我建议您提供一个全面的参考;有更多的教程在那里,最好的方法是去感受他们只是玩他们。但是,特定类型的
fmap
通常很容易使用(特别是在我看来,当编写
时)。回答这个问题的标题:我看不出“
…where
”和“让…进来”
”之间有什么大区别。两者都允许您声明函数参数绑定的几种情况:
f val = let negR (Right x) = Right (negate x)
negR y = y
in negR val
或
让{negR(Right x)=Right(否定x);negR y=y;}在negR val中
不要忘记nice从数据中获取值谢谢case表达式就是我要找的。我不明白你其余的回答;一旦我学到了更多,我会再讨论它。@ony:我认为你应该把你的评论作为一个单独的答案写出来,它实际上是介于案例
和fmap
之间的中间级别解决方案@yatima2975:我想问题更一般——模式匹配fmap
和Orther
仅为特定示例(其中使用了类型Orther
)。