我看到了这篇文章,它提供了一种关于自由单子的抽象描述。我也理解什么是单子变换器,以及它们为什么有用(在某种程度上)。但是我不知道自由单子的用途或单子变换器库是什么。我也听说过mtl vs free monad辩论,但我不确定这是什么,因为我在互联网上找不到任何讨论。请问有人能解释一下这个争议是关于什么的吗?
他们可能实际上指的是Freer monad(paper,package),据我所知,它们基本上与带有稍微不同接口的monad transformers相同,并且具有其实现的某些部分共享。
它只有一个单子类型Eff r v
,其中r
是一个神奇的类型,据我所知,它是存储数据的异构列表。要添加新的transformer,您只需要定义其核心逻辑,而无需定义任何新实例。
例如,这就是定义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))
我不确定这种方式是否比单子变换器提供了任何实际优势,因为它们已经被编写。
MonadState
类吗? - max630MonadIO
很难模拟。 - Daniel Wagner