什么是免费的monads vs mtl辩论?

时间:2018-05-26 05:49:02

标签: haskell monads

我看过this帖子,它给出了一些关于免费monad是什么的抽象表征。我也理解Monad变形金刚是什么,我(在某种程度上)理解它们为什么有用。

我不知道使用什么免费monad或monad变换器库是什么。我也听说过mtl vs free monad debate,但我不确定它是什么,因为我在互联网上找不到关于此的讨论。

有人可以解释一下这个争议是什么吗?

1 个答案:

答案 0 :(得分:1)

可能他们实际上意味着Freer monad(paperpackage),据我所知,这与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变换器提供任何实际优势,因为它们已经写好了。