我有如下類型:理解類型同義詞和參數化類型的同義詞在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'會使意義更加明顯。 –