我对使用数据类型的问题感到困惑...我一直在关注Learn You a Haskell和我的IT毕业生一样但是关于数据类型我真的搞砸了它们的使用方法,以及如何使用一个和另外一个 基本上:
class Prior a where
priority :: a -> Int
--Someway to represent a person basic attributes
--If possible this way:
data Person = Person { firstName :: String
, age :: Int
, invalid :: Bool
}
--Then to instantiate Prior and Person
instance Prioritizavel Pessoa where
priority a = ...
--Assuming a is person, something like if invalid then 0 else 1
有什么想法吗?
答案 0 :(得分:2)
class
定义了一个类型类,而不是具体的数据类型。 Person
是具体的数据类型。类型类是具体数据类型的集合,所有这些类型都“提供”常见操作 - 在本例中为priority
。
如果数据在某种意义上是“无效”,或者如果数据有效则更高,这听起来像是要将某人的优先级定义为更低。但实际上你并不需要类型类 - 你只需要一个函数priority
。如果您有多种数据类型,则将使用类型类,所有类型都支持优先级操作。
答案 1 :(得分:1)
我不确定类型类的目的是什么。我猜应该有其他情况。 以下工作正常:
class Prior a where
priority :: a -> Int
data Person = Person { firstName :: String
, age :: Int
, invalid :: Bool
}
instance Prior Person where
priority (Person _ _ i) = fromEnum $ not i -- if invalid then 0 else 1
也是如此
data Person = Person { firstName :: String
, age :: Int
, invalid :: Bool
}
priority :: Person -> Int
priority (Person _ _ i) = fromEnum $ not i
作为旁注,你不是在“实例化”这门课程。创建实例不会创建新对象或新类型。 实际上,有关类的信息在运行时不可用。如果你有
class C a where c :: a -> Int
instance C Bool where c = ...
instance C Int where c = ...
这将创建一个包含函数c_bool
和c_int
的字典,运行时根据上下文选择一个(即在Bool上调用c
选择c_bool
等)