gpt4 book ai didi

haskell - 如何为自定义数据类型定义 (+) 函数?

转载 作者:行者123 更新时间:2023-12-05 09:29:40 26 4
gpt4 key购买 nike

我是新人,从书中学习:

data Day 
= Monday
| Tuesday
| Wednesday
| Thursday
| Friday
| Saturday
| Sunday
deriving (Eq, Ord, Show, Read, Bounded, Enum)

我想我可以写一个 func 来使用 +,例如:Monday + 1 = Tuesday

所以:

:{                           
(+) :: Day -> Int -> Day
(+) x y
| y>0 = (+) (succ x) (y-1)
| y<0 = (+) (pred x) (y+1)
| y==0 = x
:}

但是ghci说它有一个错误:

? Couldn't match expected type ‘Int’ with actual type ‘Day’
? In the second argument of ‘(+)’, namely ‘(y + 1)’
In the expression: (+) (pred x) (y + 1)
In an equation for ‘+’:
(+) x y
| y > 0 = (+) (succ x) (y - 1)
| y < 0 = (+) (pred x) (y + 1)
| y == 0 = x

我不知道为什么,但我尝试了另一个:

:{                                
(+) :: (Enum a) => a -> Int -> a
(+) x y
| y>0 = (+) (succ x) (y-1)
| y<0 = (+) (pred x) (y+1)
| y==0 = x
:}

效果不错,比如:

ghci> Monday + 1     
Tuesday
ghci> Monday + 3
Thursday
ghci> Thursday + (-2)
Tuesday

但我仍然不知道 Day -> Int -> Day 有什么问题。

最佳答案

当您定义一个名为 (+) 的函数时,您正在隐藏 Prelude 的加法函数。在 (+)::Day -> Int -> Day 的主体中,您计算​​ (y + 1),期望得到一个 Int。但是这个新的 (+) 函数返回一个 Day! Enum 的多态版本可以工作,因为 Int 有一个 Enum 实例,所以 (+) 可以是用于两种类型。

要解决这个问题,您可以简单地为该操作指定一个新名称,而不是隐藏 (+)。或者,当您想使用新的 (+) 时,您可以通过编写 (y Prelude.+ 1) 来明确递归调用。

关于haskell - 如何为自定义数据类型定义 (+) 函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70528861/

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