-3

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

4

2 回答 2

3

在类型声明中,左侧的标记=是类型的名称。=定义构造函数右侧的值- 创建该类型实例的函数。

考虑一下 Maybe 的定义,这是一种表示失败可能性的简单类型(表示为nullnil在许多语言中表示):

data Maybe a = Just a | Nothing

这是具有两个构造函数的类型:JustNothing

  • 构造Just函数代表成功。它需要任何类型的参数,表示要包装的值
  • 构造Nothing函数不接受任何参数。它代表失败。

你可以在这里看到,因为Maybe有两个构造函数,所以有两种构造Maybe值的方式。这种类型称为联合类型。您可以使用模式匹配从联合类型中提取值。有几种语言结构允许模式匹配(let和- 绑定wherecase语句和函数变量绑定)。下面,我们解构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

于 2013-02-05T06:23:54.510 回答
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)
于 2013-02-05T05:51:17.227 回答