2015-10-13 67 views
8

意味着在一些Haskell代碼我碰到:是什麼()在Haskell

put :: s -> m() 

什麼是()這裏的意思?

我會使用搜索引擎,但我找不到正確處理()的人。

+0

[()函數變量和應用程序中可能的重複](http://stackoverflow.com/questions/29970012/in-function-variable-and-application) – rightfold

+0

@Elyse,我沒有看到這個問題作爲一個理想的複製目標。這有點混亂。 – dfeuer

回答

13

如果不是因爲怪異的特殊語法,可以把它定義爲

data() =() 

這是關於最無聊的類型存在。語法應該讓你想到元組:(a,b)是一對,(a,b,c)是一個三元組等,()是一個0元組。唯一缺少的是1元組,它不能使用該語法,因爲它會與通常使用的括號發生衝突。

()經常被用作沒有有趣結果的結果。例如,應該執行某些I/O並終止而不產生結果的IO操作通常會有IO()類型。當你需要一些無趣的輸入時也可以使用它; GHC有這種特殊的語法,但在Haskell 98模仿Lisp的cond的方法是這樣的:

case() of 
() | c1 -> e1 
    | c2 -> e2 
    ... 
    | otherwise -> e3 

這是完全有效的,但也非常無聊,問()你有型的什麼價值;只有一個你可以擁有的合法的一個。

從「Haskell-as-almost-category」的角度來看,()是一個最終對象。也就是說,對於任何類型的X,都有正好一個類型X ->()的合法功能,即​​。從另一個方向看,Void型pigpersoner提到的是初始對象。對於任何類型的X,都有正好一個類型Void -> X的合法功能,即absurd。如果你處於分類推理的情緒中,初始和最終對象可能會有用。

3

它被稱爲"unit type"。在某些方面,你可以把它看作是Haskell的相當於void。這是一種只有一個值的類型(也是())。

+2

FTR,它的Haskell相當於類似C的語言調用'void' _...,除了它在這些語言中根本不是一種類型。另外,「void」有點用詞不當,因爲單位類型實際上並不是空的。 Haskell也有一個['Void'類型](http://hackage.haskell.org/package/base-4.8.1.0/docs/Data-Void.html),它真的是空的(也就是說,它表現得非常好不同於'()'或C-style'void')。 – leftaroundabout

+3

Haskell中的'Void'與C中的'void'和Agda中的'()'以及Haskell中的'()'使我感到難過。當我在Haskell中提出現在是'Void'的類型時,我把它稱爲'Zero',如果只計算它的(非底部)居民,那麼它就更具有喚起性。我(驚喜地)驚訝於它在圖書館裏。這是一個實際的笑話,我的意思是我把它作爲一個笑話,但它也是實用的。 – pigworker

+2

@pigworker:也許你的實際笑話[需要稍微微妙一點](https://xkcd.com/516/)... - 我同意'Zero'對於一般程序員來說可能不那麼令人困惑大衆,但如果它不是C,那麼'Void'的名字就會很好。當然,如果Haskell因此命名了免費的ADT類型,特別是''或''應該總是'+',那麼真正好的是什麼呢? – leftaroundabout

28

()表示「無聊」。它意味着無聊的類型,它包含一件事情,也很無聊。通過比較無聊類型的一個元素和另一個元素來獲得沒有什麼有趣的東西,因爲沒有任何關於無聊類型的元素的任何關於它的知識。

它與Haskell Void中稱爲(由我希望選擇一個更好的名字的人喜歡我所建議的名稱)的空類型非常不同。空的類型是非常令人興奮的,因爲如果有人給你一個屬於它的價值,你就知道你已經死了,在天堂裏,你想要的就是你的。

但是如果有人給你一個價值(),別激動。把它扔掉。

有時採用通過「元素類型」進行參數化的類型構造函數很有趣,並使用()填充參數。您可以看到類型構造函數中固有的信息,而不是來自元素。例如,Maybe()Bool的版本,其中Just()Nothing。另外,[()]等於(可能是無限的)自然數:您擁有的唯一信息是長度。

因此,()的意思是「乏味」,但它往往是一個線索,有趣的事情發生在別的地方。

+3

你的建議是什麼? 'FALSE'? 'Initial'? 'Ridiculous'? – dfeuer

+1

我可以建議「在爆炸中去世並去天堂」嗎? – dfeuer

+3

'()'是''安心'而不是'鏜'的唯一地方就是['rnf'](https://hackage.haskell.org/package/deepseq-1.4.1.2/docs/Control-DeepSeq。 HTML#五:RNF)。 – 2015-11-07 13:27:40