0

我在使用数据类型时遇到了一个问题......我一直在关注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

有任何想法吗?

4

2 回答 2

2

class定义了一个类型类,而不是一个具体的数据类型。Person是一种具体的数据类型。类型类是具体数据类型的集合,所有这些都“提供”公共操作 - 在这种情况下,priority.

如果数据在某种意义上“无效”,听起来您想将一个人的优先级定义为较低,如果数据有效,则将其定义为较高。但是你实际上并不需要一个类型类——你只需要一个函数,priority. 如果您有多种数据类型,则将使用类型类,所有数据类型都支持优先级操作。

于 2013-11-07T16:57:52.610 回答
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并且运行时根据上下文选择一个字典(即调用cBool choosesc_bool等)。

于 2013-11-07T23:55:43.540 回答