Haskell let表达式中的模式匹配

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 -&

如何从未知构造函数的变量中提取值

例如,我想否定构建为权利的任意if中的值:

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
)。