在什么情况下可以在功能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
。
是否有人知道如何以及它的工作原理是什么?