2012-05-13 83 views
2

對不起,我不好說英語。評價「main = return(getChar,getChar)」

讓我們看看下面的代碼。

main = getChar 

第一,主要將被評估,並且它的值爲「的getchar」,但是編譯器不知道「的getchar」值,因此編譯器將評估「的getchar」計算「的getchar」的價值,所以, getChar將被執行。

其實當我測試上面的代碼。 。「的getchar執行

讓我們來看看下面的代碼

main = return (getChar, getChar) 

首先,主要的評估,它的價值回報(不確定的,不確定的) - > IO(不確定的,不確定的),所以序幕將評估IO(但是,當我測試上面的代碼,沒有兩個getChar沒有被評估。我不明白爲什麼沒有兩個getChar是爲什麼沒有被評估。

+1

順便說一下,你從哪裏得到的信息,主要的結果應該打印?事實並非如此。無論如何,它只會被丟棄。 – Ingo

+2

'return X'不執行'X'的效果。例如,'main = return getChar'將不會執行任何操作。 – sdcvvc

+0

任何人都可以在這裏提供該代碼的應用風格版本,做什麼OP想要什麼? – hugomg

回答

4

你必須實際執行你的monadic act離子然後返回它們的執行結果。

func = do 
    a <- getChar 
    b <- getChar 
    return (a,b) 

什麼目前你正在做的是類似於C語句:

void main(char &a, char &b) 
{ 
    a = getchar; 
    b = getchar; 
} 

,而不是你真正想要的:

void main(char &a, char &b) 
{ 
    a = getchar(); 
    b = getchar(); 
} 
+0

謝謝Thomas。我知道我應該使用「do notation」按順序執行monadic值。 – user1286894

+0

在這種情況下,我不明白你的問題是什麼。如果你能提供你想要的類型簽名或行爲與你正在觀察的內容,那麼這將有所幫助。 –

+0

我想知道爲什麼沒有兩個getChar沒有評估。 – user1286894

0

「我想知道爲什麼沒有的兩個getChar未評估「

首先,在英語,就像在邏輯或數學或哈斯克爾(不(非p))== P,所以你的問題是:

我想知道爲什麼兩個兩個則GetChars的評價。

令人困惑,因爲我敢打賭,他們都沒有被評估。

您的主函數計算IO a的值,然後評估IO中類型爲a的值。在你的情況下,a是(IO Char,IO Char)。因爲Haskell是一種非嚴格的語言,評估一個元組意味着構造元組。這不包括對元組件的評估。例如:

fst (42, 7 `quot` 0 :: Int) 

將不會中止除零誤差。 因此我們有:

(getChar, getChar) 

與2個未評估值的元組。 但即使評估值,我們有2個值類型IO Char。這樣的值可以被看作是一個動作,當在IO monad中執行時,返回一個Char。

因此,不僅是您的元組件不進行評估,它們也不會在IO monad中執行。

要做到這一點,你可以用兩個動作到另一個動作傳遞元組:

executeBoth (a,b) = do 
    ra <- a 
    rb <- b 
    return (ra, rb) 

現在,去檢查executeBoth的類型,你可能會看到這一點。

+0

感謝一噸。對不起,我錯了。我修改了這個。這意味着「他們沒有被評估」。 – user1286894

+0

閱讀你的答案,所以現在我知道「main =(undefined,undefined)」將不被評估。 – user1286894

+0

但是,我有一個問題。當haskell編譯「main = getChar」時,我認爲haskell評估它爲「main = undefined」,所以「getChar」不會被評估。但是當我測試代碼時,它被評估了。你能解釋一下嗎? – user1286894