gpt4 book ai didi

没有参数的 Haskell Maybe 加法器

转载 作者:行者123 更新时间:2023-12-01 23:10:25 25 4
gpt4 key购买 nike

我想知道是否可以编写函数

add :: Maybe Int -> Maybe Int
add Just x = Just (x+1)
add Nothing = Nothing

没有 x。类似于

f = Just.(+1)

不过

add Just = Just.(+1)

抛出错误:'add' 的方程式有不同数量的参数。有人可以向我解释为什么这不起作用吗?

最佳答案

您需要在某处 进行模式匹配 - 不这样做就无法“获取值(value)”。你可以使用一些不安全的函数,比如 fromJust,但是

  • 这是不安全的 - 进行大小写和模式匹配会更好
  • 它仍在进行模式匹配,因此您并没有真正避免这样做。

做到这一点的“正确模块化”方法是将此通用模式编写为高阶函数,以便您可以重用它:

  • Nothing 情况下,您返回 Nothing
  • Just 情况下,您返回 Just一些函数 应用于内部的 arg

综合以上两点,我们得出以下结论

maybeMap :: (a -> b) -> Maybe a -> Maybe b
maybeMap _ Nothing = Nothing
maybeMap f (Just x) = Just (f x)

您现在可以使用它来编写您想要的函数:

add :: Maybe Int -> Maybe Int
add x = maybeMap (+1) x
-- or we can eta reduce it - taking an argument and calling a function with it is the same as just returning the function directly
add = maybeMap (+1)

这个函数传统上称为映射,因为您要映射“容器内的值”到其他东西。

这是你经常需要为不同的“容器”(和其他一些东西)做的事情,所以我们在标准库中有一个类型类(base),以一些理论的东西命名:

class Functor f where
fmap :: (a -> b) -> f a -> f b
instance Functor [] where
fmap = map
instance Functor Maybe where
fmap = maybeMap

此外,您看到的错误完全是另外一回事。在 Haskell 中,在编写函数定义时,您的不同情况不允许采用不同数量的参数:

-- not allowed, since in the first case you've taken two args,
-- but in the second you've only taken one.
bla :: Integer -> Integer -> Integer
bla 0 y = 42
bla x = id

-- this is fine, in both cases we have two arguments
bla :: Integer -> Integer -> Integer
bla 0 y = 42
bla x y = y

关于没有参数的 Haskell Maybe 加法器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70031453/

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