我在與Haskell一起擺弄,但正在努力解決問題。下面的代碼:未能與實際類型'Horse'匹配預期類型'r'
class HasHorses e where yieldInHorses :: (InHorses r) => e -> r
class InHorses e
data Horse = Horse String
data Stable = Stable String
instance InHorses Horse
instance HasHorses Stable where yieldInHorses e = (Horse "Buttercup")
使我有以下錯誤:
source_file.hs:10:52: error:
• Couldn't match expected type ‘r’ with actual type ‘Horse’
‘r’ is a rigid type variable bound by
the type signature for:
yieldInHorses :: forall r. InHorses r => Stable -> r
at source_file.hs:10:33
• In the expression: (Horse "Buttercup")
In an equation for ‘yieldInHorses’:
yieldInHorses e = (Horse "Buttercup")
In the instance declaration for ‘HasHorses Stable’
• Relevant bindings include
yieldInHorses :: Stable -> r
(bound at source_file.hs:10:33)
哪裏線10指的是行,我instance HasHorses Stable where ...
。
也許我忽略了一些東西,但我不明白爲什麼這應該是一個錯誤。實際的Type Horse滿足r的約束條件,即它應該是InHorses。
'yieldInHorses'方法的想法是,對於HasHorses來說,調用這個方法應該告訴我馬匹(好吧,馬,開始 - 這將包括很快列表),它有。
我做了一個簡單的錯誤還是誤解了一些更基礎的東西?
類型yieldInHorses'的'實際上是'的forall河InHorses r => e - > r',這意味着*調用者可以決定*'r'應該是什麼。你正在尋找的東西就像'exists'而不是'forall',雖然[它可以使用其他結構對它們進行類似的編碼](https://wiki.haskell.org/ Existential_type)。然而,這是一個這樣一個人爲的例子,很難給出具體的建議 - 爲什麼你會需要像InHorses這樣的類型類型呢? –
而不是'InHorses r => e - > r'只需使用'e - > Horses',其中'Horses'是一種可以正確捕捉所有想要的信息的類型,可能是[Horse]'。 – user2407038
我想知道你爲什麼使用類型類。你真的需要他們嗎?如果一個類型類只有一個實例,那麼你可能應該放棄它並直接使用plain類型。 – chi