Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/9.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 如何定义具有类型族的类_Haskell - Fatal编程技术网

Haskell 如何定义具有类型族的类

Haskell 如何定义具有类型族的类,haskell,Haskell,生成“预期的约束”错误: 错误应为约束,但在SomeNote的定义中,“Note a”具有种类“*”。为什么?我怎样才能修好它 目标是在某些数据结构b中包含注释类型族的一个实例,并使用noteOf b提取该实例,无论该实例是什么。目标是在某些数据结构b中包含注释类型族的一个实例,并使用noteOf b提取该实例。 这不是类型族的工作方式。您真正说的是,您可以通过type函数Note将一种类型(由变量a表示)映射到另一种类型。这并不意味着a类型的值包含注释b类型的值。类型类相当强烈地暗示了注意类型

生成“预期的约束”错误:

错误应为
约束,但在SomeNote的定义中,“Note a”具有种类“*”。为什么?我怎样才能修好它


目标是在某些数据结构b中包含注释类型族的一个实例,并使用noteOf b提取该实例,无论该实例是什么。

目标是在某些数据结构b中包含注释类型族的一个实例,并使用noteOf b提取该实例。

这不是类型族的工作方式。您真正说的是,您可以通过type函数
Note
将一种类型(由变量
a
表示)映射到另一种类型。这并不意味着
a
类型的值包含
注释b
类型的值。类型类相当强烈地暗示了
注意
类型位于
a
类型之内或可从中计算

代码大致如下:

type family Note a
type instance Note String = String
class SomeNote a where
    noteOf :: a -> Note a

更好的是,考虑使用关联类型:

{-# LANGUAGE DataKinds #-}
{-# LANGUAGE FlexibleInstances #-}

class SomeNote a where
    type Note a :: *
    noteOf :: a -> Note a

instance SomeNote String where
    type Note String = String
    noteOf = id
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE FlexibleInstances #-}

class SomeNote a where
    type Note a :: *
    noteOf :: a -> Note a

instance SomeNote String where
    type Note String = String
    noteOf = id