【发布时间】:2011-12-19 22:47:02
【问题描述】:
对于
x :: Integer -> [a] -> [a]
x = take
y :: Integer -> [a] -> [a]
y _ [] = []
y n xs = take n xs
Hugs 和 GHC 都报告类型错误:
ERROR "test.hs":5 - Type error in application
*** Expression : take n xs
*** Term : n
*** Type : Integer
*** Does not match : Int
ERROR "test.hs":8 - Type error in explicitly typed binding
*** Term : x
*** Type : Int -> [a] -> [a]
*** Does not match : Integer -> [a] -> [a]
这是因为“take”的签名是“Int -> ...”。有没有办法告诉类型系统直接将 Integer 转换为 Int(不使用 fromIntegral),或者最好(保持 Integer 的非约束大小)“构造”一个版本的 take(或任何其他显式使用 Int 的函数) 对于整数?还是我必须编写自己的 Prelude-Functions 版本?目前,我的代码要么充斥着 fromIntegral(如果 Integer 大小超过 Int 的维度,则不会运行),或者是对标准函数进行了简单的重新实现,感觉非常笨拙。
【问题讨论】:
标签: haskell