2013-10-29 40 views
2

在什麼情況下可以在功能f :: a -> b -> c -> d通過通過傳入n + 1個參數來定義n個參數的函數?

f w x y z = ... 

定義,我也不會想到這是可能的,但尋找到enumerator包時,我發現:

enumFileRange :: FilePath 
       -> Maybe Integer --^Offset 
       -> Maybe Integer --^Maximum count 
       -> Enumerator B.ByteString IO b 
enumFileRange path offset count step = do 
    h <- tryIO (IO.openBinaryFile path IO.ReadMode) 
    let iter = enumHandleRange 4096 offset count h step 
    Iteratee (Exc.finally (runIteratee iter) (IO.hClose h)) 

Source

顯然我們有三個參數的函數,它通過傳遞四個參數來實現。同樣,enumHandleRange簽名

enumHandleRange :: MonadIO m 
       => Integer --^Buffer size 
       -> Maybe Integer --^Offset 
       -> Maybe Integer --^Maximum count 
       -> IO.Handle 
       -> Enumerator B.ByteString m b 

表明它有四個參數,但我們在上面通過傳遞五個參數調用它enumFileRangelet iter = enumHandleRange 4096 offset count h step

是否有人知道如何以及它的工作原理是什麼?

回答

12

Enumerator是一種類型的同義詞(其類似於在C typedef)爲函數類型:

type Enumerator a m b = Step a m b -> Iteratee a m b 

所以enumFileRange實際上具有以下類型:

enumFileRange :: FilePath 
       -> Maybe Integer --^Offset 
       -> Maybe Integer --^Maximum count 
       -> Step B.ByteString IO b 
       -> Iteratee B.ByteString IO b 
1

中的所有功能Haskell的簽名形式爲a -> b。如果函數具有「多個參數」,則這僅意味着b恰好是函數類型。因此,要回答

在什麼情況下一個函數f ::一個 - 「乙 - 」ç - > d爲由

f w x y z = ... 

的答案被定義將是總是,因爲不受限制的類型變量,如a, b, c, d總是可以解析爲函數類型。事實上,即使是「明明不兼容」與作爲功能型類約束,類型檢查器最初將承擔這一點,這就是爲什麼我們有時會像

GHCI,版本7.6.2這麼好笑的錯誤信息: http://www.haskell.org/ghc/:?尋求幫助
加載包ghc-prim ...正在鏈接...完成。
加載軟件包integer-gmp ... linking ... done。
正在加載軟件包基礎...鏈接...已完成。
前奏曲> 7 「×」

<交互式>:2:1:
爲(NUM([字符] - > T0))否實例從字面`7'
可能的修復而產生:添加對於(NUM([字符] - > T0))實例聲明
在表達式:7
在表達式:7 「×」
在方程`它':它= 7 「×」

對於固定類型,如Enumerator B.ByteString IO b,這是不正確的。在這種情況下,是否真的有必要處理一個函數類型的typedef,像rightfold所說的那樣是Enumerator的情況。

相關問題