小编AJ.*_*ing的帖子

Haskell Monad 任务

所以我们有以下数据类型:

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)

monads haskell

3
推荐指数
1
解决办法
199
查看次数

Haskell,实现 Monoids。什么是 Semigroup?为什么它表现得如此奇怪?

我想实现一个名为 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)

haskell monoids semigroup

2
推荐指数
2
解决办法
640
查看次数

标签 统计

haskell ×2

monads ×1

monoids ×1

semigroup ×1