2015-11-05 135 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實際上想知道什麼...我很好,因爲這個問題... –