haskell - free monads 与 mtl 的争论是什么?

标签 haskell monads

我见过this这篇文章对自由单子(monad)进行了抽象的描述。我也了解 Monad Transformer 是什么,并且我(在某种程度上)了解它们为何有用。

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

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

最佳答案

可能它们实际上意味着 Freer monad ( paperpackage ),据我所知,它们基本上与 monad 转换器相同,只是具有稍微不同的接口(interface),并且共享其实现的某些部分。

它只有一个单子(monad)类型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 转换器有任何实际优势,因为它们已经编写好了。

关于haskell - free monads 与 mtl 的争论是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50539734/

相关文章:

haskell - Haskell 中有理数的模式匹配

haskell - Haskell 中模拟对象的身份

haskell - 如何使用 State Monad 和可变向量解决 Alphametics 难题?

scala - 如何使用 Name 作为应用程序?

haskell - 从 Haskell 字符串中切割特定的 block

performance - 这个 Haskell 代码是否重用了之前的计算?

C# Continuation Monad 实现

Haskell:如何将函数映射到任意单子(monad)元组上

haskell - 我很困惑什么是递归,尾递归,原始递归,什么不是

scala - 帮助我理解这个 Scala 代码 : scalaz IO Monad and implicits