我的Haskell的一個新的學習,我的代碼如下:如何解決「非法數據類型上下文」(使用-XDatatypeContexts)?
data Num a=>Units a = Units a (SymbolicManip a)
deriving (Eq)
我不知道如何解決它?
任何人都可以幫到我嗎?
我的Haskell的一個新的學習,我的代碼如下:如何解決「非法數據類型上下文」(使用-XDatatypeContexts)?
data Num a=>Units a = Units a (SymbolicManip a)
deriving (Eq)
我不知道如何解決它?
任何人都可以幫到我嗎?
數據類型中的類型類上下文現在被認爲不是很有用的特性。問題是,以下不會編譯:
foo :: Units a -> a
foo (Units x _) = x+x
這種直覺應該編譯,因爲Units a
參數只能構建一個類型a
滿足Num a
。因此,在銷燬(模式匹配)時,應該能夠訪問Num a
實例。然而,這是不是這樣的,和Num a
必須是違反直覺銷燬提供還有:因此
foo :: Num a => Units a -> a
foo (Units x _) = x+x
標準的建議是從Units a
數據類型聲明中刪除約束Num a
,而是把它添加到每功能涉及Units a
。
另一種選擇是讓GADTs和更改數據類型爲:
data Units a where
Units :: Num a => a -> SymbolicManip a -> Units a
這不「正確」的事情:一個Num a
實例需要構建的值,並改爲提供破壞。通過這種方式,上面的第一個foo
聲明將是很好的類型。
我差點忘了「快速&髒」的選項,這是爲了讓過時的數據類型方面的特點:這是由你的文件行的開頭添加完成
{-# LANGUAGE DatatypeContexts #-}
儘管如此,我寧願修改代碼,也不願意啓用此語言擴展。
而不是調用所有的'GADTs',我認爲'存在的量化'會做。 – HTNW
[Haskell代碼行不能編譯:「非法數據類型上下文」]的可能重複(http://stackoverflow.com/questions/18934882/haskell-line-of-code-not-compiling-illegal-datatype-context ) – raymonad