我有如下类型:理解类型同义词和参数化类型的同义词在Haskell
type Name = String
type Assignation a = Name -> a
和下面的函数声明:
此函数返回一个新Assignation
返回新分配的所提供的Name
的值,以及其他Name
的先前分配的值。
我有如下类型:理解类型同义词和参数化类型的同义词在Haskell
type Name = String
type Assignation a = Name -> a
和下面的函数声明:
此函数返回一个新Assignation
返回新分配的所提供的Name
的值,以及其他Name
的先前分配的值。
仙人掌已经出色地解决了任何问题你可能已经对actAsig
函数的实现了,但是,我觉得帖子标题中的问题没有得到解决。
首先,Haskell有两个值水平语言(Object Language)和类型的高级语言(Metalanguage)。他们都很强大,但通常不会同样强大,至少不是为了同样的事情。然而,有些东西在双方都有效,例如常量,变量和函数。
A型水平常数为:
type Name = String
- 这通常称为 “类型别名”:它意味着Name
在(几乎)全部相当于String
方面作出。这不引入一个新类型,只有一个现有类型的新名称。如果您不想引入data
或newtype
的实际新类型,在这种情况下,您将引入一组需要从中映射的新值并将其现有的一组值(即类型)。因此,如果您愿意,type
只是一个方便的事情,而不是安全措施,而不是data
和newtype
。
但是,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一个函数,
f
映射字符串到某种类型的a
的值。a
f
的一个新的函数的值。所以在某种程度上,actAsig
处理函数:它接受函数并返回新的,可能修改的函数。
此外,Haskell中还具有(稍微碱性)fuzzying typelevel和值电平之间的线路,通过在型境界使得计算装置涉及的引用(依赖)到值电平,但是这是外这篇文章的范围,并将带领我们进入Dependent Types和Dependent Type Theory的世界。
感谢您的解释,这对了解这种情况下的类型行为非常有用。答案非常清楚和一致。 –
很高兴我能帮到你! –
的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
我在看标题中的问题时仍然没有看到OP的意图... –
@ErikAllik:是否有一个标志将它放在“改进”队列中? – Cactus
我只是困惑地发现OP实际上想知道什么...我很好,因为这个问题... –
'actAsig'的类型看起来很奇怪(为什么它需要一个'a'类型的参数?),并且我无法理解问题的语言。 – dfeuer
@dfeuer它看起来像他们正在使用(字符串 - >一)像一个地图,这actAsig应该是像“放”,添加一个新的映射到前台。例如'actAsig f k v x | x == k = v |否则= f x'。 – amalloy
'put ::(Name,a) - > Assignation a - > Assignation a'会使意义更加明显。 –