自由单子(Free Monads)与 MTL 的争论是什么?

6
我看到了这篇文章,它提供了一种关于自由单子的抽象描述。我也理解什么是单子变换器,以及它们为什么有用(在某种程度上)。但是我不知道自由单子的用途或单子变换器库是什么。我也听说过mtl vs free monad辩论,但我不确定这是什么,因为我在互联网上找不到任何讨论。请问有人能解释一下这个争议是关于什么的吗?

1
相关的有见地的阅读材料:Free monad considered harmful,作者是Mark Karpov。此外,还可以参考这篇关于该博客文章的讨论帖子 - duplode
1个回答

1

他们可能实际上指的是Freer monad(paperpackage),据我所知,它们基本上与带有稍微不同接口的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))

我不确定这种方式是否比单子变换器提供了任何实际优势,因为它们已经被编写。


mtl 不提供 MonadState 类吗? - max630
当然可以,但是特别是 MonadIO 很难模拟。 - Daniel Wagner
自由Monad的一个优点是,您可以拥有相同Monad操作的多个实现,并动态选择要使用的实现。 - MathematicalOrchid
@MathematicalOrchid,听到这个消息很不错。也许用示例来描述它作为另一个答案会更有意义,我也很感兴趣阅读。 - max630
@max630 这很有趣,但我不确定它与原始问题的相关性。 - MathematicalOrchid
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接