在什么情况下可以f :: a -> b -> c -> d
定义函数
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
.
有人知道这是如何工作的吗?