当前位置:  开发笔记 > 编程语言 > 正文

免费monad和免费操作

如何解决《免费monad和免费操作》经验,为你挑选了1个好方法。

来形容免费单子的一种方式是说,这是一个最初在endofunctors的类别(某些类别的幺C),其对象是endofunctors从CC,箭头是它们之间的自然变换.如果我们CHask的是endofunctor所谓Functor在Haskell,这是由函子* -> *,其中*代表的对象Hask

通过initiality,从endofunctor任何地图t到幺mEnd(Hask)诱导从地图Free tm.

所述否则,从算符任何天然转化t到单子m诱导从天然转化Free tm

我原以为能够编写一个函数

free :: (Functor t, Monad m) => (? a. t a ? m a) ? (? a. Free t a ? m a)
free f (Pure  a) = return a
free f (Free (tfta :: t (Free t a))) =
    f (fmap (free f) tfta) 

但这无法统一,而以下工作

free :: (Functor t, Monad m) => (t (m a) ? m a) ? (Free t a ? m a)
free f (Pure  a) = return a
free f (Free (tfta :: t (Free t a))) =
    f (fmap (free f) tfta)

或者它与签名的概括

free :: (Functor t, Monad m) => (? a. t a ? a) ? (? a. Free t a ? m a)

我是否在类别理论或Haskell的翻译中犯了错误?

我有兴趣在这里听到一些智慧......

PS:启用了该代码

{-# LANGUAGE RankNTypes, UnicodeSyntax #-}
import Control.Monad.Free

András Kovác.. 7

Haskell翻译似乎错了.一个很大的提示是你的free实现不会在任何地方使用monadic bind(或join).你可以找到freefoldFree,定义如下:

free :: Monad m => (forall x. t x -> m x) -> (forall a. Free t a -> m a)
free f (Pure a)  = return a
free f (Free fs) = f fs >>= free f

关键是f专注于t (Free t a) -> m (Free t a),从而Free一举消除一层.



1> András Kovác..:

Haskell翻译似乎错了.一个很大的提示是你的free实现不会在任何地方使用monadic bind(或join).你可以找到freefoldFree,定义如下:

free :: Monad m => (forall x. t x -> m x) -> (forall a. Free t a -> m a)
free f (Pure a)  = return a
free f (Free fs) = f fs >>= free f

关键是f专注于t (Free t a) -> m (Free t a),从而Free一举消除一层.

推荐阅读
低调pasta_730
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有