我正在学习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
?
答案 0 :(得分:3)
在类型声明中,=
左侧的标记是类型的名称。 =
define 构造函数右侧的值 - 创建该类型实例的函数。
考虑Maybe的定义,这是一种表示失败可能性的简单类型(在许多语言中表示为null
或nil
):
data Maybe a = Just a | Nothing
这是一个包含两个构造函数的类型:Just
和Nothing
:
Just
构造函数表示成功。它需要任何类型的参数,表示要包装的值Nothing
构造函数不带参数。它代表失败。您可以在此处看到,因为Maybe
有两个构造函数,所以有两种构造Maybe
值的方法。这些类型称为 union 类型。您可以使用模式匹配从联合类型中提取值。有几种语言结构允许模式匹配(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
下面我们定义一个从Map中提取Variable
值的函数。
getVariable :: Store -> Variable
getVariable (Map v _) = v
应用该功能:
> getVariable m
"someVar"
希望您正在学习的资源很快就会涵盖这些内容。如果没有,我建议剂量为Real World Haskell。
答案 1 :(得分:2)
以下是一些示例用法:
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)