定义循环类型的Integers表示,如下所示:
data Integers = Zero | Next Integers | Prev Integers
Run Code Online (Sandbox Code Playgroud)
做出这种表示,类民的情况下,这意味着你应该可以使用(+), (*), (==), abs, signum, show上Integers
直到现在我定义了这样:
data Integers = Zero | Integers Int deriving (Show)
next :: Integers -> Integers
next Zero = Integers 1
next (Integers a) = Integers a + Integers 1
prev :: Integers -> Integers
prev (Integers 1) = Zero
prev (Integers a) = Integers a - Integers 1
instance Eq Integers where
Zero == Zero = True
Integers a == Integers b = a == b
_ == _ = False
instance Num Integers where
Integers a + Integers b = Integers (a + b)
Integers a - Integers b = Integers (a - b)
Integers a * Integers b = Integers (a * b)
abs (Integers a) = Integers (abs a)
signum (Integers a) = Integers (signum a)
fromInteger a = Integers (fromInteger a)
Run Code Online (Sandbox Code Playgroud)
但它不符合data Integers = Zero | Next Integers | Prev Integers预期
data Integers = Zero | Next Integers | Prev Integers
Run Code Online (Sandbox Code Playgroud)
我要告诉你+,剩下的应该很容易.
Zero + y = y
x + Zero = x
Run Code Online (Sandbox Code Playgroud)
嗯,这很容易!
哦.还有一些其他案例.
尽管如此,我们已经处理了所有Zero情况,所以现在我们只需处理Prev和处理Next.他们彼此相反,不是吗?因此,如果我们给予其中一个,他们将互相取消.
Next x + Prev y = x + y
Prev x + Next y = x + y
Run Code Online (Sandbox Code Playgroud)
现在我们只需要担心我们给出的数字都具有相同符号的情况.
Next x + Next y = Next (Next (x + y))
Prev x + Prev y = Prev (Prev (x + y))
Run Code Online (Sandbox Code Playgroud)
(这最后两个方程不是最有效的实现,但它们很容易理解.)
我们已经完成了定义+.
其他一些函数更容易,有些更难(并且应该重用一些更简单的函数),但它们都涉及/或/ both参数的模式匹配并做适当的事情.并且它们主要涉及递归,在给定递归数据结构时通常在某种程度上是不可避免的.
| 归档时间: |
|
| 查看次数: |
170 次 |
| 最近记录: |