为了更好地理解monad,我试图写我自己的。我从一些非一元代码开始,可以使用一些帮助将它翻译成单元。Haskell:翻译为Monad
这个人为的例子的基本思想:对于计算的每个整数结果,我想跟踪该整数是偶数还是奇数。例如,在4 + 5 = 9
中,我们可能会返回(9, Odd)
。我想用>>=
连锁/组合计算。例如:
return 1 >>= (+2) >>= (+5) >>= (+7) =result=> (15, Odd)
现在,我有以下的非单一产品代码:
data Quality = Odd | Even deriving Show
qual :: Integer -> Quality
qual x = case odd x of
True -> Odd
_ -> Even
type Qualifier = (Integer, Quality)
mkQ :: Integer -> Qualifier
mkQ x = (x, qual x)
plusQ :: Qualifier -> Qualifier -> Qualifier
plusQ (x, _) (y, _) = (x+y, qual (x+y))
chain = plusQ (mkQ 7) . plusQ (mkQ 5) . plusQ (mkQ 2)
有什么办法我能翻译上面的代码放到一个单子?我应该寻找哪些模式以及它们的常用翻译模式是什么?
非常感谢提前!
这不容易承认一元翻译。 Monads通过类型进行参数化,对任何类型都有意义。 Yor计算只对内部人员有意义。 –
看起来你正在试图模拟状态转换/动作,在这种情况下,你的状态就是“质量”。你会想看看[** State Monad **](http://learnyouahaskell.com/for-a-few-monads-more),其中你的状态monad是由“Quality”和你的操作参数化的, (+1)'会变成状态行为。 – aaronlevin
@ n.m。好点,也是我开始看到和想知道的。什么可能是一个简单的,通用的过程的更好的例子,适合这样的练习? –