2015-11-05 136 views
1

我有如下类型:理解类型同义词和参数化类型的同义词在Haskell

type Name = String 

type Assignation a = Name -> a 

和下面的函数声明:

​​

此函数返回一个新Assignation返回新分配的所提供的Name的值,以及其他Name的先前分配的值。

+1

'actAsig'的类型看起来很奇怪(为什么它需要一个'a'类型的参数?),并且我无法理解问题的语言。 – dfeuer

+3

@dfeuer它看起来像他们正在使用(字符串 - >一)像一个地图,这actAsig应该是像“放”,添加一个新的映射到前台。例如'actAsig f k v x | x == k = v |否则= f x'。 – amalloy

+0

'put ::(Name,a) - > Assignation a - > Assignation a'会使意义更加明显。 –

回答

3

仙人掌已经出色地解决了任何问题你可能已经对actAsig函数的实现了,但是,我觉得帖子标题中的问题没有得到解决。


首先,Haskell有两个值水平语言(Object Language)和类型的高级语言(Metalanguage)。他们都很强大,但通常不会同样强大,至少不是为了同样的事情。然而,有些东西在双方都有效,例如常量,变量和函数。

A型水平常数为:

type Name = String 

- 这通常称为 “类型别名”:它意味着Name在(几乎)全部相当于String方面作出。这引入一个新类型,只有一个现有类型的新名称。如果您不想引入datanewtype的实际新类型,在这种情况下,您将引入一组需要从中映射的新值并将其现有的一组值(即类型)。因此,如果您愿意,type只是一个方便的事情,而不是安全措施,而不是datanewtype

但是,Haskell类型级别语言也支持函数,即从1个或多个类型到某些现有类型的映射。可以认为这是参数别名,可以这么说。

type Assignation a = Name -> a 

此创建称为Assignation用参数a一个类型的功能。给定一个类型a,它返回一些类型,在这种情况下,类型Name -> a。所以Assignation Int返回Name -> Int; Assignation Person返回Name -> Person等。请注意,有时键入功能不使用一个或多个它们的参数,就像值水平的函数:

type Empty a =() 

如果我们结合这个新的知识,我们就可以开始在类型级评估/还原的角度思考,即评价,认为只需要类型签名,类型函数,类类型约束计算等的边界之内的地方

让这适用于actAsig类型签名,一步一步:

Assignation a -> Name -> a -> Assignation a 
Assignation a -> String -> a -> Assignation a 
(Name -> a) -> String -> a -> (Name -> a) 
(String -> a) -> String -> a -> (String -> a) 

所以您在上面最后一行看到的高阶函数类型是actAsig的实际类型,所有抽象消除/减少。

在人类语言而言,签名descirbes一个函数,

  1. 需要一个功能f映射字符串到某种类型的a的值。
  2. 采用字符串
  3. 采用该类型a
  4. 返回类型相同f的一个新的函数的值。

所以在某种程度上,actAsig处理函数:它接受函数并返回新的,可能修改的函数。


此外,Haskell中还具有(稍微碱性)fuzzying typelevel和值电平之间的线路,通过在型境界使得计算装置涉及的引用(依赖)到值电平,但是这是外这篇文章的范围,并将带领我们进入Dependent TypesDependent Type Theory的世界。

+0

感谢您的解释,这对了解这种情况下的类型行为非常有用。答案非常清楚和一致。 –

+0

很高兴我能帮到你! –

7

actAsig的规范,如果我的理解没错,就是那个给

assignation1 :: Assignation a 
newName :: Name 
newValue :: a 

assignation2 = actAsig assignation1 newName newValue 

assignation2的要求是

assignation2 name = if name == newName then newValue else assignation1 name 

所以,你可以准确地把它写这样的:

actAsig :: Assignation a -> Name -> a -> Assignation a 
actAsig assignation1 newName newValue name = 
    if name == newName then newValue else assignation1 name 
+1

我在看标题中的问题时仍然没有看到OP的意图... –

+0

@ErikAllik:是否有一个标志将它放在“改进”队列中? – Cactus

+0

我只是困惑地发现OP实际上想知道什么...我很好,因为这个问题... –