2013-10-29 41 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的情况。

相关问题