2014-03-24 26 views
3

我的Haskell的一個新的學習,我的代碼如下:如何解決「非法數據類型上下文」(使用-XDatatypeContexts)?

data Num a=>Units a = Units a (SymbolicManip a) 

     deriving (Eq) 

我不知道如何解決它?

任何人都可以幫到我嗎?

+1

[Haskell代碼行不能編譯:「非法數據類型上下文」]的可能重複(http://stackoverflow.com/questions/18934882/haskell-line-of-code-not-compiling-illegal-datatype-context ) – raymonad

回答

14

數據類型中的類型類上下文現在被認爲不是很有用的特性。問題是,以下不會編譯:

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 #-} 

儘管如此,我寧願修改代碼,也不願意啓用此語言擴展。

+0

而不是調用所有的'GADTs',我認爲'存在的量化'會做。 – HTNW

相關問題