Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Haskell 理解类型_Haskell - Fatal编程技术网

Haskell 理解类型

Haskell 理解类型,haskell,Haskell,我正在学习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来获取变量的值 如何在存储中保存变量的值?以下是一些示例用法: s

我正在学习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
来获取变量的值


如何在
存储中保存变量的值?

以下是一些示例用法:

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)

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

考虑Maybe的定义,它是一种表示故障可能性的简单类型(在许多语言中表示为
null
nil
):

这是一个具有两个构造函数的类型:
Just
Nothing

  • Just
    构造函数表示成功。它需要任何类型的参数,表示要包装的值
  • Nothing
    构造函数不接受任何参数。它代表着失败
您可以在这里看到,因为
Maybe
有两个构造函数,所以有两种方法可以构造
Maybe
值。这种类型称为联合类型。可以使用模式匹配从联合类型中提取值。有几种语言结构允许模式匹配(
let
where
-绑定、
case
语句和函数变量绑定)。下面,我们将分解函数参数中的

fromJust :: Maybe a -> a
fromJust (Just x) = x
假设已将其加载到GHCI中。在这里,我们使用
Just
构造函数创建
Maybe
的实例,然后再次检索该值:

> let x = Just 20
> fromJust x

  20
下面是模式匹配如何查找您的类型。我们使用您定义的
Map
构造函数创建
Store
类型的实例:

> let m = Map "someVar" $ IntVal 0
下面我们定义一个函数,该函数将从映射中提取
变量

getVariable :: Store -> Variable
getVariable (Map v _) = v
应用该函数:

> getVariable m

  "someVar"

希望你正在学习的资源能很快涵盖这些内容。如果没有,我建议服用一剂

你试过什么?另外,将
String
别名添加到
Variable
似乎令人困惑和愚蠢。根据您问题的措辞,我怀疑您可能混淆了类型和值。通过声明
type Store=Map Variable Value
您没有创建一个名为“Store”的映射来存储东西;您只创建了一个类型别名。必须使用
数据.Map
模块中的
empty
insert
fromList
等可用函数创建
存储
类型的值。在第二行,我有
不在fromList
范围内。为什么?@capoluca您需要导入
数据.Map
。您还会发现
Data.Map
中的
lookup
函数与
Prelude
中基于列表的函数冲突,因此我建议执行
import Data.Map as M
,然后使用
M.lookup
> getVariable m

  "someVar"