Scott编码列表可以定义如下: 与 ADT 版本相反, List既是类型又是数据构造函数。 Scott 编码通过模式匹配来确定 ADT,这实质上意味着移除了一层构造函数。 这是没有隐式 arguments 的完整uncons操作: 这很有意义。 uncons接受一个常量、一个延续和一个Li ...
Scott编码列表可以定义如下: 与 ADT 版本相反, List既是类型又是数据构造函数。 Scott 编码通过模式匹配来确定 ADT,这实质上意味着移除了一层构造函数。 这是没有隐式 arguments 的完整uncons操作: 这很有意义。 uncons接受一个常量、一个延续和一个Li ...
我的印象是,类型a每个值都可以用 rank-2 多态类型newtype Id a = Id {runId :: forall r. (a -> r) -> r } newtype Id a = Id {runId :: forall r. (a -> r) -> r }延续 ...
当我声明这个新类型时: 这将定义假设的rank-2类型ListScott :: ((a -> ListScott a -> r) -> r -> r) -> ListScott a ,编译器抱怨r不在范围内。 从类型签名中我不想将第一类多态函数传递给Lis ...
这是一个有文化的haskell帖子。 只需将其保存为“ChurchList.lhs”即可运行它。 教会编码列表是一种通过函数表示列表的方式。 它类似折叠和延续传递风格。 为了说明这对应于列表,这里是O(n)同构 这些东西具有良好的性能特征。 现在,问题来自ta ...
我一直在free软件包中使用Control.Monad.Free的Free数据类型。 现在我正在尝试将其转换为在Control.Monad.Free.Church使用F ,但无法弄清楚如何映射函数。 例如,使用Free的简单模式匹配函数看起来像这样 - 我可以轻松地将它转换为使用 ...
可以使用Scott编码来表示ADT,方法是通过匹配器替换产品和匹配器。 例如: 可以使用Scott Encoding编码为: 但我找不到如何使用SE编码嵌套类型: 怎么做到呢? ...
假设我有一个scott编码的列表,例如: 我想要一个接收这种列表并将其转换为实际列表( [1,2,3] )的函数,除了这样的函数不能递归。 也就是说,它必须是eta-beta正常形式。 这个功能存在吗? ...
或者具体来说,为什么我们使用foldr来编码列表和迭代来编码数字? 对于长篇介绍很抱歉,但我真的不知道如何命名我想问的事情,所以我需要先给一些说明。 这很大程度上吸引了这个CAMcCann的帖子 , 这个帖子只是不太满足我的好奇心,而且我也会用rank-n-types和无限懒惰的东西来处 ...