在什麼情況下可以在功能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))
顯然我們有三個參數的函數,它通過傳遞四個參數來實現。同樣,enumHandleRange
簽名
enumHandleRange :: MonadIO m
=> Integer --^Buffer size
-> Maybe Integer --^Offset
-> Maybe Integer --^Maximum count
-> IO.Handle
-> Enumerator B.ByteString m b
表明它有四個參數,但我們在上面通過傳遞五個參數調用它enumFileRange
:let iter = enumHandleRange 4096 offset count h step
。
是否有人知道如何以及它的工作原理是什麼?