我有以下類型聲明:該類型的價值是什麼?
data MyType = MyVal Int deriving (Eq, Show)
正如你所看到的,它只有一個參數一個數據類型構造。
在這本書中,它說:
因爲MYVAL有一個int參數,類型的MyType的值必須 包含一個 - 只有一個 - int值
爲什麼Int
值MyType類型或它是什麼意思?
我有以下類型聲明:該類型的價值是什麼?
data MyType = MyVal Int deriving (Eq, Show)
正如你所看到的,它只有一個參數一個數據類型構造。
在這本書中,它說:
因爲MYVAL有一個int參數,類型的MyType的值必須 包含一個 - 只有一個 - int值
爲什麼Int
值MyType類型或它是什麼意思?
這並不是說int是MyType
型的,它說,MYVAL(構造函數)只能包含一個Int,因此,例如,你不能這樣做MyVal "hey!"
入住這
Prelude> data MyType = MyVal Int deriving (Eq, Show)
Prelude> :t MyVal 9
MyVal 9 :: MyType
Prelude> MyVal '9'
<interactive>:12:7: error:
• Couldn't match expected type ‘Int’ with actual type ‘Char’
• In the first argument of ‘MyVal’, namely ‘'9'’
In the expression: MyVal '9'
In an equation for ‘it’: it = MyVal '9'
正如你可以看到,使用MyVal
至極的唯一途徑是MyType
類型是與Int
,所以沒有其他的類型是允許的。
要超明確,清晰,這是希望有所幫助:你說:「正如你所看到的,它只有一個參數一個數據類型的構造。」,但我會調整略。
data MyType = MyVal Int deriving (Eq, Show)
這裏MyType
是類型。這是一個類型構造零個參數,是查看它的一種方式。或者,你可以說它是數據類型構造函數。
但是,MyVal
是價值構造函數。它是MyType
數據類型的值構造函數之一(在本例中只有一個)。也就是說,它實際上是一個構造MyType
類型值的函數。因此,MyType
有稱爲MyVal
一個值構造它有一個參數。該參數的類型爲Int。
如果我們問GHCI一下這個函數的類型,很明顯它的一個說法是Int
類型: Main> :t MyVal MyVal :: Int -> MyType
爲什麼是有用的「包裝」類型Int
時,它已經是一個類型?其中一個原因是,它的MyVal
含義從Int
分離,這樣的話你可以有自己的類型,它是根據類型檢查和你的代碼Int
不同,儘管它的表現恰好是現在的Int
。
也許明天你可能會決定將其更改爲Integer
,在這種情況下,所有你可能需要做的是改變一個地方,你的代碼的其餘部分就可以了(假設你不使用Int
指您解開MyVal
S,並且您有數據訪問功能,以處理有關的MyVal
內在價值)的基礎操作。另外,僅供參考,像這樣在data
聲明中包裝單個類型通常不會在專業代碼中完成,因爲它需要花費執行週期來包裝和解包。還有另外一種方式來聲明這樣的單值類型,稱爲newtype
,它提供了一種免費的(在運行時)方式來向編譯器和類型檢查器解釋您想要一個具有作爲現有值之一的表示的獨特值。我確信你正在閱讀的任何書籍都會在適當的時候解釋這一點,但如果沒有,請留下留言以便稍後查看。