gpt4 book ai didi

haskell - let 表达式中的模式匹配

转载 作者:行者123 更新时间:2023-12-04 00:53:09 26 4
gpt4 key购买 nike

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

例如,我想否定 If 构造为 Right 中的值:

let Right x = getValue
in Right (negate x)

此代码成功地将 Right 的值(在本例中为 Int)绑定(bind)到 x。

这可行,但如果 getValue 返回一个 Left 怎么办?有没有办法确定 let 表达式中变量的类型?或者有没有更好的方法来解决这个问题?

最佳答案

一般来说,你可以做的是:

case getValue of
Right x -> Right $ negate x
e -> e
这样做应该很清楚:它就像函数参数中的模式匹配,但是针对一个值。为了做你需要的事情,你有一个默认情况,它会捕获任何不匹配的东西,然后返回它。
但是,在您的特定情况下,您可以做一些更好的事情:
negate `fmap` getValue
或者,使用 import Control.Applicative , 你可以使用 <$>作为 fmap 的同义词( negate <$> getValue)。 fmap函数的类型为 fmap :: Functor f => (a -> b) -> f a -> f b .对于任何 functor1, fmap将普通值上的函数转换为仿函数内的函数。例如,列表是仿函数,对于列表, fmap = map .在这里, Either e表示一个仿函数,它要么是一个异常(exception) Left e或一个值 Right a ;将函数应用于 Left什么都不做,只是将函数应用于 RightRight 中应用它.换句话说,
instance Functor (Either e) where
fmap _ (Left l) = Left l
fmap f (Right r) = Right $ f r
因此 case版本是您问题的直接答案,但您的特定示例更接近 fmap .
1:大致上,仿函数是“容器”。如果您对各种类型的类(class)不满意,我推荐 the Typeclassopedia供全面引用;还有更多的教程,感受它们的最好方法就是和它们一起玩。但是, fmap对于特定类型通常很容易使用(尤其是在我看来,写成 <$> 时)。

关于haskell - let 表达式中的模式匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3078388/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com