使用具有约束类型的方法的Typeclass实例

尼顿

首先让我道歉,尽管我很确定以前已经问过这个问题,但我只是找不到我的问题的答案。现在:

我想编写FunctorMonad实例为二进制(搜索)树。更准确地说,某些功能类似于insertmerge需要的实例Ord,例如:

data Tree a = Empty | Node a (Tree a) (Tree a)
insert :: (Ord a) => Tree a -> a -> Tree a
merge  :: (Ord a) => Tree a -> Tree a -> Tree a

因此,以下代码无法编译:

instance Monad Tree where
  {- ... -}
  Empty >>= f        = Empty
  (Node v l r) >>= f = merge (f v) (merge newL newR)
                       where newL = l >>= f
                             newR = r >>= f

-- No instance for (Ord b) arising from a use of `merge'...

我不知道有什么更好的选择,我曾尝试声明Ord使用ADT约束,DatatypeContexts但已弃用并且无论如何都无法使用。其他扩展名(如FlexibleInstancesetc)似乎都有用,直到我意识到它们确实意味着其他含义。

那么,有没有办法,我将如何解决?感谢您的时间。

编辑:同时,我发现了这个有用的答案,但是似乎对类型类做这种事情Functor仍然是一个问题。

GS-向Monica致歉

您可以通过多种方式来执行此操作,但是没有一种方法是完全干净的。

您应该查找的关键术语是“受限单子”。

这是rmonad的一个示例(我写过)。

{-# LANGUAGE NoImplicitPrelude, TypeFamilies, GADTs,
             FlexibleInstances, MultiParamTypeClasses #-}

import Control.RMonad.Prelude
import Data.Suitable


data Tree a = Empty | Node a (Tree a) (Tree a)
insert :: (Ord a) => Tree a -> a -> Tree a
insert = undefined
merge  :: (Ord a) => Tree a -> Tree a -> Tree a
merge = undefined

data instance Constraints Tree a where
    TreeConstraints :: Ord a => Constraints Tree a

instance Ord a => Suitable Tree a where
  constraints = TreeConstraints


instance RFunctor Tree where
  fmap f Empty = Empty
  fmap f (Node v l r) = Node (f v) (fmap f l) (fmap f r)    


instance RMonad Tree where
  {- ... -}
  Empty >>= f        = Empty
  (Node v l r) >>= f = withResConstraints $ \TreeConstraints ->
        merge (f v) (merge newL newR)
           where newL = l >>= f
                 newR = r >>= f

请在此处查看该软件包的常规文档

请注意,这RMonad是与类型类型不同的类Monad如果您想要一个真实的Monad实例,可以使用AsMonad Tree

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

从无约束的方法中调用具有约束的通用类型的方法

来自分类Dev

对类型具有算术约束的Typeclass实例

来自分类Dev

具有约束的Haskell实例

来自分类Dev

具有约束的Scala通用类型

来自分类Dev

如何使用具有约束和动态功能的Scipy最小化

来自分类Dev

如何在Swift中从带有类型别名的协议中引用具有约束的泛型类?

来自分类Dev

使用具有文件类型约束的html上传文件

来自分类Dev

具有受限返回类型的Typeclass实例

来自分类Dev

C#从具有约束的泛型推断类型

来自分类Dev

Swift 转换为具有约束的泛型类型

来自分类Dev

在实例头中具有行类型的Typeclass实例?

来自分类Dev

具有约束的通用方法的重载解析问题

来自分类Dev

使用networkx在边缘上具有约束的图同构

来自分类Dev

设置具有约束的分区Java

来自分类Dev

计算具有约束的重复行

来自分类Dev

具有约束的EF自参考

来自分类Dev

如何在TypeScript中使用具有接口联合类型的实例?

来自分类Dev

为什么泛型 T 仅在具有约束时才被推断为文字类型?

来自分类Dev

使用具有属性的静态方法

来自分类Dev

使用具有属性的静态方法

来自分类Dev

为什么带有约束的通用参数类型不能匹配模式,而直接使用约束类型呢?

来自分类Dev

使用具有协议和关联类型的通用类型?

来自分类Dev

具有约束类和结构的 List<T> 的扩展方法

来自分类Dev

正确的方法来使用具有Lazy fetch类型的检索外部对象

来自分类Dev

使用具有不同类型/类列表的通用方法

来自分类Dev

使用HashMap和反射来调用具有可变参数类型的方法

来自分类Dev

类型特征以使用具有const变体的特定方法检测结构

来自分类Dev

c#使用具有基本类型的字典覆盖方法

来自分类Dev

正确的方法来使用具有Lazy fetch类型的检索外部对象

Related 相关文章

  1. 1

    从无约束的方法中调用具有约束的通用类型的方法

  2. 2

    对类型具有算术约束的Typeclass实例

  3. 3

    具有约束的Haskell实例

  4. 4

    具有约束的Scala通用类型

  5. 5

    如何使用具有约束和动态功能的Scipy最小化

  6. 6

    如何在Swift中从带有类型别名的协议中引用具有约束的泛型类?

  7. 7

    使用具有文件类型约束的html上传文件

  8. 8

    具有受限返回类型的Typeclass实例

  9. 9

    C#从具有约束的泛型推断类型

  10. 10

    Swift 转换为具有约束的泛型类型

  11. 11

    在实例头中具有行类型的Typeclass实例?

  12. 12

    具有约束的通用方法的重载解析问题

  13. 13

    使用networkx在边缘上具有约束的图同构

  14. 14

    设置具有约束的分区Java

  15. 15

    计算具有约束的重复行

  16. 16

    具有约束的EF自参考

  17. 17

    如何在TypeScript中使用具有接口联合类型的实例?

  18. 18

    为什么泛型 T 仅在具有约束时才被推断为文字类型?

  19. 19

    使用具有属性的静态方法

  20. 20

    使用具有属性的静态方法

  21. 21

    为什么带有约束的通用参数类型不能匹配模式,而直接使用约束类型呢?

  22. 22

    使用具有协议和关联类型的通用类型?

  23. 23

    具有约束类和结构的 List<T> 的扩展方法

  24. 24

    正确的方法来使用具有Lazy fetch类型的检索外部对象

  25. 25

    使用具有不同类型/类列表的通用方法

  26. 26

    使用HashMap和反射来调用具有可变参数类型的方法

  27. 27

    类型特征以使用具有const变体的特定方法检测结构

  28. 28

    c#使用具有基本类型的字典覆盖方法

  29. 29

    正确的方法来使用具有Lazy fetch类型的检索外部对象

热门标签

归档