我看过this帖子,它给出了一些关于免费monad是什么的抽象表征。我也理解Monad变形金刚是什么,我(在某种程度上)理解它们为什么有用。
我不知道使用什么免费monad或monad变换器库是什么。我也听说过mtl vs free monad debate,但我不确定它是什么,因为我在互联网上找不到关于此的讨论。
有人可以解释一下这个争议是什么吗?
答案 0 :(得分:1)
可能他们实际上意味着Freer monad(paper,package),据我所知,这与monad变换器基本相同,只是另一个接口并且有一部分实现共享。
它只有一个monadic类型Eff r v
,其中r
是一个神奇的类型,据我所知,它是一个存储数据的异构列表。要添加新的转换器,您只需要定义其核心逻辑,而不必定义任何新实例。
例如,这需要多少来定义State(代码是从package复制的,并受其许可,BSD-3-Clause的约束):
data State s v where
Get :: State s s
Put :: !s -> State s ()
get :: Member (State s) r => Eff r s
get = send Get
put :: Member (State s) r => s -> Eff r ()
put s = send (Put s)
runState :: Eff (State s ': r) w -> s -> Eff r (w,s)
runState (Val x) s = return (x,s)
runState (E u q) s = case decomp u of
Right Get -> runState (qApp q s) s
Right (Put s') -> runState (qApp q ()) s'
Left u' -> E u' (tsingleton (\x -> runState (qApp q x) s))
我不确定这种方式是否比monad变换器提供任何实际优势,因为它们已经写好了。