[Haskell]|[Haskell] 签名限制了类型推导
问题
fix :: (a -> a) -> a
fix g = let x = g x in xw = \f -> \n -> case n of
1 -> print 1
n -> do
f(n-1)
print nfix w 10-- 可以得到结果 ()
但是如果给
w
加上类型签名,编译器就会报错,w :: (Int -> IO Int) -> Int -> IO ()fix w 10
Couldn't match type ‘()’ with ‘Int’原因
Expected type: (Int -> IO ()) -> Int -> IO ()
Actual type: (Int -> IO Int) -> Int -> IO ()
In the first argument of ‘fix’, namely ‘w’
In the expression: fix w 10
w
是fix
的第一个参数,所以类型应该为a -> a
,给
w
写上类型签名之后,w
的类型为(Int -> IO Int) -> Int -> IO ()
,与a -> a
矛盾,所以报错。不给
w
显式写类型签名,则w
的类型可以推断为(Int -> IO x) -> Int -> IO ()
,其中
Int -> IO x
是f
的类型,f
的返回值类型是无法推断的。在do-notation中,
do
f(n-1)
print n
f(n-1)
相当于省略了i
的i <- f(n-1)
简写,因此f
的返回值并没有被其他函数使用,其类型是无法推断的。【[Haskell]|[Haskell] 签名限制了类型推导】在
fix w 10
中,f
的类型最终确定为Int -> IO ()
,此时
w
的类型为(Int -> IO ()) -> Int -> IO ()
,与a -> a
并不矛盾,其中a
为Int -> IO ()
。推荐阅读
- 运维|如何限制IP 通过 SSH连接服务器
- vue项目+wxjssdk,config配置解决iPhone端签名错误的问题
- 2018.8.21|2018.8.21 晴 打破自我限制
- 怎么看待“贫穷限制我的想象力”
- 限制的好处
- 你的名字,还可以这样写(——第17批个性艺术签名新鲜出炉啦~)
- 数字签名是什么(转自阮一峰的博客)
- 实现文件下载的限制
- Java接口签名(Signature)实现方案
- 基于React实现的PDF在线预览-签名-导出