2016-04-21 76 views
1

我是Haskell語言的新手,我在讀取函數時遇到了一些問題。 準確地說,我的理解是:Haskell中的讀取函數

read "8.2" + 3.8 

應該回到12.0,因爲我們要返還相同種類的第二個成員。 我沒有得到的東西是爲什麼:

read "True" || False 

Return True?好吧,它返回與False相同的類型,它是布爾型的,但我不明白爲什麼第一個成員。我想我有一個模糊的想法,就像在這種情況下返回函數將返回第一個成員,因爲條件是|| ? 請幫我一把。另外,如果這只是你們大多數人的基本要求,我很抱歉,但我真的很想說明這一點。

+1

well'True OR anything' ** is **'True';)...(它不*返回第一個成員,而是or操作的結果 - 嘗試'讀取「True」&& False'如果你喜歡) – Carsten

+0

謝謝!我有同樣的想法,只需要有人爲我澄清這一點。再次感謝你。 –

+0

np - 我想它和答案一樣好,因爲可能存在(?) – Carsten

回答

8

在ghci中請跟隨!

Prelude> let x = read "True" 
Prelude> :t x 
x :: Read a => a 

所以x沒有具體的類型。 x是一種表達方式,當我們要求它時,可以提供一個具體類型的值。我們可以問x是一個IntBool或任何我們想要的。特別是:

Prelude> x :: Bool 
True 

我們也可以問它是一個Int

Prelude> x :: Int 
*** Exception: Prelude.read: no parse 

但它未能成爲一體。

所以在你的代碼片段中,我們什麼時候要求它成爲什麼東西?

Prelude> :t (||) 
(||) :: Bool -> Bool -> Bool 

功能(||)需要一個Bool,所以它要求它的參數成爲Bool秒。正如我們已經看到的,當我們要求x成爲Bool時,它將成爲Bool的值True。所以說:

Prelude> x || False 
True 

就像是說:

Prelude> True || False 
True 

而且(||)代表the logical OR operation,所以結果是True

+0

非常感謝,我非常感謝您的幫助! –

4

以及True OR anythingTrue

返回的第一個成員,但還是操作的結果

你應該嘗試

read "True" && False 

看出差別


也許略有備註/另外:

從某種意義上說,你在那裏的權利,它返回第一個組件 - 但僅僅是因爲True || _ = True所以即使True || undefined是確定的:

Prelude> read "True" || undefined 
True 
+0

哦,好吧,我對讀取功能有所錯誤。再次感謝你。 –