2016-12-01 80 views
1

優秀PureScript book解釋說,爲什麼不Eff爲具有最後返回值

fullName :: forall r. Record (firstName :: String, lastName :: String | r) -> String 
fullName person = person.firstName <> " " <> person.lastName 

的箭頭,然後比較Eff單子

import Prelude 

import Control.Monad.Eff.Random (random) 
import Control.Monad.Eff.Console (logShow) 

main :: forall eff. Eff (console :: CONSOLE, random :: RANDOM | eff) Unit 
main = do 
    n <- random 
    logShow n 

我的問題是: 爲什麼不main的簽名在單元之前包含->

main :: forall eff. Eff (console :: CONSOLE, random :: RANDOM | eff) -> Unit 

這將使類似-> String如在fullName

從同一章節(重點煤礦)的摘錄的簽名:

主要是有副作用的計算,它可以運行在支持隨機數生成和控制檯IO, 和任何其它類型的副作用任何 環境,並且其返回類型的值 單位

+0

你明白這意味着什麼的那種['Eff'](https://pursuit.purescript.org/packages/purescript-eff/2.0.0/docs /Control.Monad.Eff#t:Eff)是'#! - > * - > *'? –

+0

有點。我重讀了它,它確實告訴我的理解。謝謝 – RAbraham

回答

1

兩個函數之間的一個區別是fullName有一個參數(在->之前)。函數簽名規定它需要一些記錄並返回一個字符串。

main不帶任何參數,因爲它是應用程序的「入口點」,它返回Eff。所以main只是返回一個類型。該類型恰好有兩個類型參數

函數參數和類型參數看起來完全相同,但它們處於不同的級別。帶參數的類型具有構造函數,並應用其參數來生成實際類型。它看起來像函數應用程序,但在類型級別!類型的「簽名」被稱爲 ...您可以瞭解更多關於它的內容,但可以將其視爲「類型的類型」。

現在Eff是一種結合了一些效果和一些「實際結果」的類型。其構造函數應用效果行作爲第一個參數,結果類型作爲第二個參數。在main的情況下,它所做的只是副作用,所以「實際結果」是Unit,這基本上什麼都沒有。

如果main的簽名是:

main :: forall eff. Eff (console :: CONSOLE, random :: RANDOM | eff) -> Unit 

這將意味着

  • Eff只需要一定的效果行作爲類型參數(不匹配的Eff定義)
  • mainEff作爲參數(但它是從哪裏來的?)
  • main回報只是Unit