我在閱讀Purescript通過示例並介紹了讀者單元的部分。示例如下:瞭解閱讀器monad
createUser :: Reader Permissions (Maybe User)
createUser = do
permissions <- ask
if hasPermission "admin" permissions
then map Just newUser
else pure Nothing
對我而言,令人困惑的部分是ask
函數。簽名是:
ask :: forall r. Reader r r
它看起來好像它創建了一個讀者憑空
當我念叨State
單子,它與它的get
功能相同的概念。並解釋如下文字:
該狀態是由狀態monad的數據構造函數隱藏的函數參數實現的,所以沒有明確的引用來傳遞。
我猜這是關鍵,而同樣的事情,與讀者發生在這裏,但我不明白它是如何工作...
在上面的例子中運行通過runReader
,如何提供的值是否突然顯示爲ask
的結果? Haskell文檔ask
說:檢索monad環境。但我的困惑是從哪裏?我看到它的方式,價值傳遞到runReader
,得到存儲某處,並得到它 - 你叫ask
...但這是沒有意義的。
雖然示例是Purescript,但我猜猜任何Haskell識字人員也能夠回答,因此Haskell標籤。
'Reader a b'是'a - > b'的一個包裝。所以,問問::。讀者a'最終只是'forall a'類型的一個值。 a - > a',並在其周圍包裝。 –