2017-03-04 81 views
0

我特林聲明如下一個新的類型值:如何在Haskell中聲明帶有類型約束的新類型?

data Value m = Wrong | Num Int | Fun (Value -> m Value) 

而且GHCI抱怨:

<interactive>:160:39: 
    Expecting one more argument to ‘Value’ 
    Expected a type, but ‘Value’ has kind ‘k0 -> *’ 
    In the type ‘Value -> m Value’ 
    In the definition of data constructor ‘Fun’ 
    In the data declaration for ‘Value’ 

PS:我想實現的The essence of functional programming

回答

4

代碼,因爲Value需要一個類型參數,您需要在使用Value時提供該參數。也就是說,您應該將其稱爲Value m,而不僅僅是Value。所以,你的類型定義應該是:

data Value m = Wrong | Num Int | Fun ((Value m) -> m (Value m)) 
+0

他們,我幾乎得到它... – wtl

+0

'Value'曾經是這是隻針對單一類型的構造'M'用一種定義的類型'* - > * '。你推廣'Value'是一個類型構造函數本身,但是一個接受'* - > *'類型的值而不是具體類型的值。這意味着您需要將'Value'應用於定義中的'm' *遍地*,以便您的定義進行類型檢查。 – chepner