【发布时间】:2018-10-27 21:19:55
【问题描述】:
--defining function
safeHead :: [a] -> Maybe a
safeHead [] = Nothing
safeHead (x:_) = Just x
--calling function
safeHead (4:5:3:[]:[])
当我使用参数 (4:5:3:[]:[]) 调用 safeHead 时,模式只评估参数以查看它是否为空或是否有头部。因此,尽管有无意义的“[]:[]”,但它不应该抛出错误,因为这部分甚至没有被评估。
【问题讨论】:
-
因为这是一个类型错误。编译器不是惰性的,并且会执行类型检查。
-
一开始你不能构造一个有两种不同类型的列表。
-
以防万一您以前从未使用过具有编译时类型的语言:类型是在程序运行时计算的值上的 not 标记。类型是对哪些值可能出现在某个地方的静态限制。
-
@Redu
4和[]不一定有两种不同的类型。可以有相同的类型。 -
@WillemVanOnsem 这是一个 type 错误吗?
:t safeHead (4:5:3:[]:[])报告了一个类型,所以可能不是。