2

为什么要隐藏“视图”数据结构和相关的运算符Control.Monad.Free等?purescript-freeFreeViewtoView

使用通常的 Free Monad 公式 -

data Free f a = Pure a | Free (f (Free f a))

并给定一个仿函数,例如-

data TeletypeF a = PutStrLn String a | GetLine (String -> a)

我可以编写一些简单(虽然丑陋)的代码来折叠链式 PutStrLn 调用,如下所示 -

collapseChained :: Free TeletypeF a -> Free TeletypeF a
collapseChained (Free (PutStrLn s1 (Free (PutStrLn s2 c)))) = Free PutStrLn (s1 ++ s2) c
collapseChained f = f

在不使用任何实际数据构造函数的情况下,是否collapseChained可以使用 Purescript 导出的函数?Control.Monad.Free

4

1 回答 1

1

我尝试了一段时间这样做,runFreeM但没有成功,所以不,我认为不可能像这样直接进行转换。

您提到的通常公式Free不适合在 PureScript 中使用,因为它不能使堆栈安全,因此不幸的是,对树的直接操作是模糊的。构造函数现在根本没有导出,因为我们使用内部不安全的强制来使实现成为可能,以反射风格没有 Remorse

我们之前有一个稍微不同的实现,没有强制,类似于 scalaz Free,因为这也需要一个堆栈安全的实现,但我认为这也会有同样的问题。

也许如果我们暴露更多的内部(fromView,toView等)是可能的,但它仍然不如直接模式匹配方法那么令人愉快,而且我认为暴露这些可能会有安全问题。

于 2016-01-05T15:31:07.613 回答