我正在閱讀 A. Mokhov、N. Mitchell 和 S. Peyton Jones 的文章Build systems à la carte。
他們定義的第一個概念是 a 的概念Task。它有型別
newtype Task c k v = Task ( forall f. c f => (k -> f v) -> f v )
其中c是一個約束(例如Applicative或Monad),k是鍵的型別和v值。
我需要一些幫助來決議forall f上述定義中的含義。如果定義Task是
newtype Task k v = Task ( (k -> v) -> v )
那么就很清楚了:Task 是一種在 中構建值的v方法,給出了一種(k -> v)從相應鍵檢索其輸入的方法。
如果我們添加f到組合中,會發生什么變化?(k -> f v)如果任務必須接受任何可能f滿足的型別的輸入,它怎么能定義一個任務c呢?
uj5u.com熱心網友回復:
您已經正確理解了 forall - 該功能必須適用于任何可能的 f。
要定義任務,請記住我們將知道 c 是什么,因此我們可以使用 Applicative 或 Monad 的工具。
假設我們想要一個Task Monad Int String
t :: Task Monad Int String
t = Task taskFunction
所以我們需要一個適用于任何 monad 的函式。
taskFunction :: forall f . Monad f => (Int -> f String) -> f String
(這個簽名中可以省略forall,無論如何它都會被暗示。)
我們使用 bind、return、do 表示法等來撰寫它。
taskFunction getter = do x <- getter 37
y <- getter 42
return (x y)
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/517110.html
標籤:哈斯克尔对所有人
上一篇:如何定義可以存盤任意數量的“人”的“PersonList”
下一篇:Haskell中的應用實作
