Haskell 理解类型
我正在学习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
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"