2014-09-10 22 views
1
返回10

我的序言老師問我們,沒有人能給出一個答案紮實,我不能在網上找到答案。讓利之間創建一個函數x = 10和X <時有什麼區別 - 在Haskell

+0

既不是一個表達式或對自己的語法,有效的,所以你應該告訴教授這個問題上錯誤陳述 – jberryman 2014-09-10 22:23:41

+0

@jberryman:其實我懷疑教授陳述的問題比OP在這裏發佈的內容更健康... – leftaroundabout 2014-09-10 22:26:18

+0

他實際上把這個問題放在一個測試中,它用西班牙語,但這裏是它的問題3https://www.dropbox.com/s/ j9cqo8b2s2ioyfa/Tarea%25201.pdf?dl = 0 – 2014-09-10 22:31:19

回答

1

讓我們給雙方一些minimial方面:

foo, foo' :: IO() 

foo = do 
    let x = 10 
    print x 

foo' = do 
    x <- return 10 
    print x 

兩者都只是語法糖:

foo ≡ (\x -> print x) 10 
foo' ≡ return 10 >>= \x -> print x 

,或者,如果我們稱之爲共同拉姆達p

foo ≡ p 10 
foo' ≡ return 10 >>= p 

顯然, foo是更基本,更喜歡(特別是因爲它的工作原理與任何返回類型p,不只是單子)。然而,由monad laws,兩者其實需要是等效的,對任何單子!

+0

你不是說'foo'更基本嗎? – Sarah 2014-09-10 22:27:31

+0

'我當然糾正了。 – leftaroundabout 2014-09-10 22:47:41

+0

但讓綁定是多態的(模仿可怕的單態限制)和單子綁定不是。所以他們不相同。 – augustss 2014-09-11 00:31:57

2

閱讀your dropbox link,似乎缺少的情況下你的問題是這樣的:你的教授是假設你在裏面GHCI,Haskell的解釋,它的工作原理有點從編譯器不同的運行。

的問題,翻譯成英文,是這樣的:

在Haskell功能與保留字let

let x = 10 

另一種方式定義的功能定義來定義一個函數,如下所示:

x <- return 10 

有什麼區別,什麼是每種方法的優缺點?

是交代不清的其他人對這些問題的評論是,這些都不是在一個Haskell源文件的有效表達的第一件事情,但兩者都在do塊有效聲明(見leftaroundabout的答案)也正因爲如此他們也在GHCI提示有效輸入:

GHCi, version 7.6.3: http://www.haskell.org/ghc/ :? for help 
Loading package ghc-prim ... linking ... done. 
Loading package integer-gmp ... linking ... done. 
Loading package base ... linking ... done. 

Prelude> x <- return 10 
Prelude> x 
10 

Prelude> let y = 10 
Prelude> y 
10 

即交代不清的是,無論這些例子是定義一個函數的第二件事情;他們將一個值綁定到一個變量。 let可以用來定義函數,但據我所知<-不能。這聽起來像你的老師混淆了術語「功能」和「可變」。

在任何情況下:

  • let x = 10語法結合x純值;
  • x <- return 10x綁定到結果

因此,您可以使用​​執行以下操作,但不能使用let variable = expression執行以下操作。 (請注意,第二行是輸入我在打字。)

Prelude> str <- getLine 
La pregunta de tu profesor me parece algo disparatada. 

Prelude> str 
"La pregunta de tu profesor me parece algo disparatada." 
相關問題