所以我们有以下数据类型:
data Expr = Num Double | Add Expr Expr | Var Char deriving Show
和
type Env = [(Char, Double)]
此外,我们还有这两个函数:
evalDo :: Env -> Expr -> Maybe Double
evalDo _ (Num a) = return a
evalDo e (Var c) = getvar e c
evalDo e (Add a b) = do
a' <- evalDo e a
b' <- evalDo e b
Just (a'+b')
Run Code Online (Sandbox Code Playgroud)
和
getvar :: Env -> Char -> Maybe Double
getvar [] c = Nothing
getvar ((x,y):es) …Run Code Online (Sandbox Code Playgroud) 我想实现一个名为 ComplexNumber 的自定义数据类型,如下所示:
data ComplexNumber a = C (a,a)
现在我想实现 Monoid 变量并定义二进制 mempty 元素和 mappend,如下所示:
instance Num a => Monoid (ComplexNumber a) where
mempty = C (0,0)
mappend = (C (a1, b1)) (C (a2, b2)) = C (a1 + a2, b1 + b2)
Run Code Online (Sandbox Code Playgroud)
但这没有成功,所以试图找出原因并遇到了 Semigroup (我仍然不太理解)并找到了一个至少可以编译并且似乎可以使用的解决方案:
instance Num a => Semigroup (ComplexNumber a) where
(C (a1, b1)) <> (C (a2,b2)) = C (a1 + a2, b1 + b2)
instance Num a => Monoid (ComplexNumber a) where
mempty = C (0,0) …Run Code Online (Sandbox Code Playgroud)