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
- 有像
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的类!