我正在学习 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)