我正在學習Haskell,我想了解類型。假設我有Store
類型的對象:瞭解類型
import Data.Map (Map)
import qualified Data.Map as Map
type Variable = String
data Value = IntVal Int
| BoolVal Bool
type Store = Map Variable Value
如何使用這個對象,說s
得到變量的值?
如何保存變量的值Store
?
我正在學習Haskell,我想了解類型。假設我有Store
類型的對象:瞭解類型
import Data.Map (Map)
import qualified Data.Map as Map
type Variable = String
data Value = IntVal Int
| BoolVal Bool
type Store = Map Variable Value
如何使用這個對象,說s
得到變量的值?
如何保存變量的值Store
?
下面是一些例子用法:
s :: Store
s = fromList [("key1", IntVal 4), ("key2", BoolVal False)]
lookup "key1" s -- Just (IntVal 4)
lookup "key2" s -- Just (BoolVal False)
lookup "key3" s -- Nothing
s' :: Store
s' = insert "key3" (BoolVal True) s
lookup "key3" s' -- Just (BoolVal True)
在第二行我有'不在範圍fromList'。爲什麼? – ashim
@capoluca你需要導入'Data.Map'。你還會發現'Data.Map'中的'lookup'函數與'Prelude'中的基於列表的函數衝突,因此我建議'將Data.Map導入爲M',然後使用'M.lookup'。 –
在一個類型聲明,對=
左側的標記是類型的名稱。 =
右側的值定義了構造函數 - 創建該類型實例的函數。
考慮的可能的定義,一個簡單的類型,它表示了故障(在許多語言表示爲null
或nil
)的可能性:
data Maybe a = Just a | Nothing
這與兩個構造函數類型:Just
和Nothing
:
Just
表示成功。它需要任何類型的參數,表示要包裝的值Nothing
不帶任何參數。它代表失敗。你可以在這裏看到,因爲Maybe
有兩個構造函數,有兩種構造Maybe
值的方法。這種類型被稱爲聯合類型。您可以使用模式匹配從工會類型中提取值。有幾種語言結構允許模式匹配(let
和where
-bindings,case
語句和函數變量綁定)。下面,我們解構一個函數參數中的Just
值。
fromJust :: Maybe a -> a
fromJust (Just x) = x
假設這是加載到GHCI。在這裏,我們創建的Maybe
一個實例,使用Just
構造函數,然後再檢索該值:
> let x = Just 20
> fromJust x
20
這裏的模式匹配如何尋找你的類型。我們創建使用您已經定義了Map
構造的Store
類型的實例:
> let m = Map "someVar" $ IntVal 0
下面我們定義一個函數,將提取從地圖Variable
值。
getVariable :: Store -> Variable
getVariable (Map v _) = v
應用功能:
> getVariable m
"someVar"
希望你從學習資源將很快覆蓋這些東西。如果不是,我推薦一劑Real World Haskell。
那麼,你嘗試了什麼?另外,將'String'別名到'Variable'似乎令人困惑和愚蠢。 – Pubby
根據你的問題的措辭,我懷疑你可能會混淆類型和價值。通過聲明'type Store = Map Variable Value',你還沒有創建一個名爲「Store」的地圖來存儲事物;你只做了一個類型別名。必須使用'Data.Map'模塊中的'empty','insert','fromList'等可用函數創建一個類型'Store'的值。 –