Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/google-chrome/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Haskell 更多的rmonad库?_Haskell_Monads_Monad Transformers - Fatal编程技术网

Haskell 更多的rmonad库?

Haskell 更多的rmonad库?,haskell,monads,monad-transformers,Haskell,Monads,Monad Transformers,我想用RMonad做一些基本的事情。有没有办法使用“as monad”功能来 是否有一个标识rmonad,以应用monad transformers 有像StateTtransformers这样的常见事物吗 是否向现有单子添加约束?(例如,如果需要带有附加约束的StateT) 不幸的是,我还没有掌握数据族等使它工作的东西。。。否则我可能很乐意自己编写代码 编辑 我从图书馆的资料中一起入侵了StateT,看看它是否有效 []快速浏览后,您的StateT版本看起来是正确的。不幸的是,使用RMon

我想用
RMonad
做一些基本的事情。有没有办法使用“as monad”功能来

  • 是否有一个标识rmonad,以应用monad transformers
  • 有像
    StateT
    transformers这样的常见事物吗
  • 是否向现有单子添加约束?(例如,如果需要带有附加约束的
    StateT
不幸的是,我还没有掌握数据族等使它工作的东西。。。否则我可能很乐意自己编写代码

编辑 我从图书馆的资料中一起入侵了StateT,看看它是否有效


[]

快速浏览后,您的StateT版本看起来是正确的。不幸的是,使用RMonad等人确实需要复制几乎所有的东西;我开始使用合适的工具编写一些代码,但放弃了,因为它涉及太多的重复(最终我并不真正需要它)

编辑:

根据我记忆中的
合适的
工作原理,它是这样的:

考虑
函子
类:
不能是它的实例,因为它需要额外的
命令
约束

天真的方法可能类似于:

{-# LANGUAGE UndecidableInstances #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE FunctionalDependencies #-}
{-# LANGUAGE MultiParamTypeClasses #-}

import qualified Data.Set as S

class MyFunctor c a | c -> a where
      myfmap :: (MyFunctor c b) => (a -> b) -> c a -> c b

instance (Ord a) => MyFunctor S.Set a where
      myfmap = S.map
但这将返回以下错误:

Error: test.hs:11:16: Could not deduce (Ord b) arising from a use of `S.map'
    from the context (Ord a)
      bound by the instance declaration at /tmp/test.hs:10:10-37
    or from (MyFunctor S.Set b)
      bound by the type signature for
                 myfmap :: MyFunctor S.Set b => (a -> b) -> S.Set a -> S.Set b
      at /tmp/test.hs:11:7-20
    Possible fix:
      add (Ord b) to the context of
        the type signature for
          myfmap :: MyFunctor S.Set b => (a -> b) -> S.Set a -> S.Set b
        or the instance declaration
    In the expression: S.map
    In an equation for `myfmap': myfmap = S.map
    In the instance declaration for `MyFunctor S.Set a'
为什么会这样?这是因为在实例级别没有保留或找到约束,所以GHC没有意识到在使用
myfmap
时,
b
上应该有
Ord
约束

合适的
类型用于显式创建约束字典,该字典允许您指定以下类型的约束:

import Data.Suitable
import qualified Data.Set as S

class MyFunctor c where
      myfmap :: (Suitable c a, Suitable c b) => (a -> b) -> c a -> c b

instance MyFunctor S.Set where
      myfmap f s = withConstraintsOf s
                   $ \ SetConstraints
                       -> withResConstraints $ \ SetConstraints -> S.map f s
(其中,
SetConstraints
已在
数据中定义。合适的

这个实现是可行的,但它确实使类型签名更加复杂,方法实现更加复杂(注意这里我们需要引入
SetConstraints
两次:一次用于
seta
,另一次用于
setb
)。请注意,对于没有任何约束的类型,不需要任何合适的约束函数


我开始尝试在Typeclassopedia中创建合适的类版本,但放弃了,因为实例变得非常复杂。

您不需要使用CPP来创建上下文同义词。您可以将类声明与单个实例声明一起使用。对,我知道,谢谢!不过,我现在使用它的目的更多了。如果您对
上下文
机制的工作原理有一些直觉,那么一个两句话的快速摘要将非常有用,谢谢@gatoatigrado:不过这表明,很快就会有更好的方法来编写类似RMonad的类!