将数据类型与另一个数据类型一起使用并实例化它

时间:2013-11-07 16:39:45

标签: haskell

我对使用数据类型的问题感到困惑...我一直在关注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

有什么想法吗?

2 个答案:

答案 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_boolc_int的字典,运行时根据上下文选择一个(即在Bool上调用c选择c_bool等)