Tom*_*rek 10 haskell functional-programming flip
Prelude功能的类型flip是:
flip :: (a -> b -> c) -> b -> a -> c
Run Code Online (Sandbox Code Playgroud)
即,它需要一个二进制函数和两个参数.
Prelude功能的类型id是:
id :: a -> a
Run Code Online (Sandbox Code Playgroud)
但是类型flip id是:
flip id :: a -> (a -> b) -> b
Run Code Online (Sandbox Code Playgroud)
这怎么可能应用flip到id的时候id是一个一元函数,并flip要求对第一个参数二元函数?
顺便说一句.flip id类似于\ x f -> f x
Nef*_*byr 15
Haskell 通过设置id使第一个参数的类型适合.所以:flipa = b -> c
flip :: ( a -> b -> c) -> b -> a -> c
flip :: ((b -> c) -> b -> c) -> b -> (b -> c) -> c
flip id :: b -> (b -> c) -> c
Run Code Online (Sandbox Code Playgroud)
在哪里id被认为是类型
id :: (b -> c) -> b -> c
Run Code Online (Sandbox Code Playgroud)
这相当于
id :: (b -> c) -> (b -> c)
Run Code Online (Sandbox Code Playgroud)
即专门化id仅适用于一元函数.
编辑:我想我可能会改写我的第一行:
Haskell的推断是id适合的第一个参数的类型flip ,如果 a = b -> c.
如果有更清楚的话.