哈斯克尔替代类和虚函数可以说我有以下ADT,警卫
data Properties a = Property String a
deriving (Show,Eq)
我已经做了以下情况吧,
instance Functor Properties where
fmap f (Property name prop) = Property name (f prop)
--
instance Applicative (Properties) where
pure a = Property "" a
(Property _ f) <*> p = fmap f p
instance Monad (Properties) where
return a = Property "" a
(Property name prop) >>= f = (f prop)
到目前为止好。让我们看看我们可以迄今为止做,
pColors = Property "Color" ["Blue", "Red", "White"]
pNationality = Property "Nationality" ["Italian", "Norwegian", "Spanish"]
answers = do
color <- fmap permutations pColors
nation <- fmap permutations pNationality
return $ zip color nation
给人,
*Main> answers
Property "" [(["Blue","Red","White"],["Italian","Norwegian","Spanish"]),(["Red","Blue","White"],["Norwegian","Italian","Spanish"]),(["White","Red","Blue"],["Spanish","Norwegian","Italian"]),(["Red","White","Blue"],["Norwegian","Spanish","Italian"]),(["White","Blue","Red"],["Spanish","Italian","Norwegian"]),(["Blue","White","Red"],["Italian","Spanish","Norwegian"])]
所以fmap
和预期的单子绑定都在工作。现在我想使用alternative
中的guard
函数。基本上我想根据一些谓词修剪pColors
和pNationality
。所以我尝试定义,
instance Alternative (Properties) where
empty = Property "" []
但是,这给了我一个错误,我认为(请纠正我,如果我错了),这是因为Haskell是解释[]
从a
不同。但我认为a
可能是任何东西,而[]
是其中之一,所以问题是什么?
如果您使用'{ - #LANGUAGE GeneralizedNewtypeDivingiving# - }' – 4castle
您可以执行'newtype属性a =属性(String,a)派生(Show,Eq,Functor,Applicative,Monad)'上面的ADT?如果我编写'newtype Property a = String a derivation(Show,Eq,Functor,Applicative,Monad)',它自己假设(避免多个'Property'的声明)'给出一个错误,Functor不能派生出来并且不得不使用'DerivedFunctor'。 – ITA
并加入'DerivedFunctor'则误差变, '不能让“应用型住宅” (甚至狡猾GeneralizedNewtypeDeriving)的衍生实例: 不能ETA-减少表示类型enough' – ITA