2016-10-04 200 views
2

我熟悉的NEWTYPE聲明:新類型聲明函數?

newtype MyAge = Age {age :: Int} deriving (Show, Eq, Ord) 

在這種情況下年齡是int,但是我遇到下面的代碼,我無法理解這一點:

newtype Ages a = Ages {age :: String -> [(a,String)]} 

這似乎是一個函數聲明? (接受字符串,返回包含'a'和字符串的元組列表) - 這是正確的嗎?

N.B我剛剛意識到這只是聲明函數的基本記錄語法。

此外,我試圖實現這種類型的,但我必須做一些錯誤:

newtype Example a = Example {ex :: Int -> Int} 

myexample = Example {ex = (\x -> x + 1)} 

這將編譯,但我不明白爲什麼,因爲我沒有通過' '參數?

+1

不要將新問題添加到現有帖子。也就是說,'Example a'是使用[phantom type](https://wiki.haskell.org/Phantom_type)的一個例子。 – chepner

回答

5

這似乎是一個函數聲明?

是的。具體來說,String -> [(a,String)]是一個函數類型。 newtype聲明類似於任何給定類型的簡單包裝。沒有限制,說你不能基於函數類型來創建它,它的工作方式完全相同。

還記得你可以總是替換newtypedata;在這種情況下,將結果類型考慮爲具有作爲函數的字段的記錄類型可能會有所幫助; newtype只是一個特殊的優化案例。其他


有一點要提的是,你的兩條線路也是不同的是,第二個是參數化了a。當然,這可以用常規的類型一起使用:

newtype MyWrapper a = MyWrapper a 

或函數的類型可以是newtype -d沒有參數化

newtype MyFunction = MyFunction (Float -> Float) 

你也可以寫上使用記錄語法,讓你的「吸氣劑「功能。

+0

如何將此新類型聲明更改爲正常函數聲明? –

+0

@barbrac你是指函數聲明還是常規類型別名?如果是後者,只需使用'type'。 –

+0

@barbrac這就是問題應該從一開始看起來的樣子。請避免進行大幅度改變Q/A範圍的編輯。 –