haskell - 推断 if ... then ... else 奇怪的行为

标签 haskell if-statement type-inference

考虑以下错误代码:

fun x = 
    if (null x) then 0
    else (take 50 x) : (fun (drop 50 x)) 

我注意到,我可以毫无问题地将它加载到 ghci 中,这就是问题所在。
当我尝试评估此函数时,该程序仅检索到错误。

关于 if ... then ... else 表达式的默认推理规则,由于两个分支显式检索不同的类型,为什么可以加载(即编译)此代码?我的意思是,为什么编译器无法确定这段代码格式错误?

注意:当然,如果我为此函数添加正确的类型注释,正如预期的那样,它将被拒绝,但在我的理解中,它也应该在没有类型注释的情况下被拒绝。

最佳答案

重载 numeric literals . Haskell 数字文字是基于类型上下文定义的任何 Num 类的实例。

推断类型解释了它:

Prelude> let f x = if null x then 0 else take 50 x : f (drop 50 x)

Prelude> :t f
f :: Num [[a]] => [a] -> [[a]]

这读作“如果您有一个用于 a 列表的 Num 类的实例,那么此函数将 a 的列表转换为 a 的列表。

所以它依赖于一个神话般的 Num 实例来获取列表。如果您尝试编译使用它的代码,而没有为列表列表提供数字实例,则会出现编译错误。

这个例子也说明了为什么最好先写下类型签名。

关于haskell - 推断 if ... then ... else 奇怪的行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15177470/

相关文章:

haskell - 为什么 GHC 在使用 Coercible 约束时会自相矛盾?

c - 为什么 if 会结束我的 while 语句

ios - 在 Swift 中针对 Nil 值漂亮地测试多个变量

compiler-errors - Ocaml-匹配两个列表

c# - 是否有语法进行反向类型推断?

haskell - H-15 遇到麻烦

haskell - 如何使用 Haskell 中的时间库创建 UTCTime 值?

C# 货币转换器 : Reduce the amount of if statements

java - Java 泛型方法类型推断的困惑

haskell - haskell中树上的最大元素?