我正在学习 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
?
在类型声明中,左侧的标记=
是类型的名称。=
定义构造函数右侧的值- 创建该类型实例的函数。
考虑一下 Maybe 的定义,这是一种表示失败可能性的简单类型(表示为null
或nil
在许多语言中表示):
data Maybe a = Just a | Nothing
这是具有两个构造函数的类型:Just
和Nothing
:
Just
函数代表成功。它需要任何类型的参数,表示要包装的值Nothing
函数不接受任何参数。它代表失败。你可以在这里看到,因为Maybe
有两个构造函数,所以有两种构造Maybe
值的方式。这种类型称为联合类型。您可以使用模式匹配从联合类型中提取值。有几种语言结构允许模式匹配(let
和- 绑定where
、case
语句和函数变量绑定)。下面,我们解构Just
函数参数中的值。
fromJust :: Maybe a -> a
fromJust (Just x) = x
假设这被加载到 GHCI 中。Maybe
在这里,我们使用构造函数创建 的实例Just
,然后再次检索该值:
> let x = Just 20
> fromJust x
20
以下是模式匹配查找您的类型的方式。我们使用您定义Store
的构造函数创建该类型的实例:Map
> let m = Map "someVar" $ IntVal 0
下面我们定义了一个Variable
从 Map 中提取值的函数。
getVariable :: Store -> Variable
getVariable (Map v _) = v
应用功能:
> getVariable m
"someVar"
希望您从中学习的资源将很快涵盖这些内容。如果没有,我推荐一剂Real World Haskell。
这是一些示例用法:
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)