Vla*_*sky 24 haskell types type-inference
我是Haskell的新手,我试图理解为什么需要编写类型声明.由于Haskell有类型推断,我什么时候需要第一行?GHCI似乎生成正确的输出我用':t'
到目前为止,我发现的唯一一个似乎需要声明的例子如下.
maximum' :: (Ord a) => [a] -> a
maximum' = foldr1 max
Run Code Online (Sandbox Code Playgroud)
但是,如果我添加"-XNoMonomorphismRestriction",则不再需要标志声明.是否存在类型推断不起作用且需要指定类型的特定情况?
由于我可能在类型声明中有错误并且没有直接的好处,我宁愿不写它.我刚刚开始学习Haskell,所以如果我错了请纠正我,因为我想养成良好的习惯.
编辑:事实证明,类型推断是真实世界Haskell书中的一个双刃剑部分,对这个主题进行了很好的讨论.
Joh*_*iss 28
undefined.一切都编译我知道我的想法似乎不太糟糕.然后我继续undefined用真实代码替换alt*_*ive 15
考虑read "5".Haskell怎么知道这种类型read "5"?它不能,因为没有办法解决操作的结果,因为read被定义为(Read a) => String -> a.a不依赖于字符串,因此它必须使用上下文.
然而,通常上下文是类似的Ord,Num因此无法确定.这不是单态限制,而是另一种永远无法正确处理的情况.
例子:
不起作用:
read "0.5"
putStrLn . show . read $ "0.5"
Run Code Online (Sandbox Code Playgroud)
工作:
read "0.5" :: Float
putStrLn . show . (read :: String -> Float) $ "0.5"
Run Code Online (Sandbox Code Playgroud)
这些是必要的,因为默认情况Show下,如果我没记错的话,是Int.
安心.有时确保编译器同意您对函数类型应该是什么的看法是很好的.如果推断的类型没有与您给定的类型统一,那么编译器会对您大喊大叫.熟悉类型系统后,您会发现可选类型签名对您的编码信心非常有利.
| 归档时间: |
|
| 查看次数: |
1914 次 |
| 最近记录: |