gpt4 book ai didi

haskell - 更多 rmonad 库?

转载 作者:行者123 更新时间:2023-12-02 12:55:22 28 4
gpt4 key购买 nike

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

  • 有一个身份 rmonad,可以应用 monad 转换器吗?
  • 有诸如 StateT 变压器之类的常见东西吗?
  • 向现有 monad 添加约束? (例如,如果有人想要一个具有附加约束的 StateT)

不幸的是,我还没有掌握数据族等使其发挥作用的东西......否则我可能会很乐意自己编写代码。

编辑

我从库源中将 StateT 一起破解,看看它是否有效......

[http://pastebin.com/VT3uyEgr ]

最佳答案

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

编辑:

根据我的内存,Suitable 的工作原理是这样的:

考虑 Functor 类:Set 不能是它的实例,因为它需要额外的 Ord 约束。

一个简单的方法是这样的:

{-# 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 时,应该对 有一个 Ord 约束b.

Suitable 类型用于显式创建约束字典,它允许您指定这些类型的约束:

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 已在 Data.Suitable 中定义)

此实现有效,但它确实使类型签名更加复杂,并且方法实现更加复杂(请注意,我们需要引入 SetConstraints 两次:一次用于Set a,另一个用于Set b)。请注意,对于没有任何约束的类型,不需要任何 Suitable 约束函数。

我已经开始尝试在 Typeclassopedia 中创建类的合适版本,但由于实例变得相当复杂而放弃了。

关于haskell - 更多 rmonad 库?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7342683/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com