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