【发布时间】:2014-06-23 02:38:49
【问题描述】:
我试图弄清楚 Haskell 确定函数类型的方式。我写了一个示例代码:
compareAndIncrease a b =
if a > b then a+1:b:[]
else a:b:[]
它基于 a > b 比较构造一个列表。然后我用:t 命令检查了它的类型:
compareAndIncrease :: (Ord a, Num a) => a -> a -> [a]
好的,所以我需要一个类型类 Ord 用于比较,Num 用于数值计算(如 a+1)。然后我获取参数 a 和 b 并得到一个列表作为回报 (a->a->[a])。一切似乎都很好。但后来我在某个地方找到了一个复制数字的函数:
replicate' a b
| a ==0 = []
| a>0 = b:replicate(a-1) b
请注意,正常,库复制功能是在里面使用,而不是复制的。应该和 compareAndIncrease 类似,因为它使用比较、数值运算并返回一个列表,所以我认为它会这样工作:
replicate' :: (Ord a, Num a) => a -> a -> [a]
但是,当我检查:t 时,我得到了这个结果:
replicate' :: Int -> t -> [t]
我继续摆弄这个函数并将它的名字改为repval,所以现在是:
谁能给我解释一下发生了什么?
【问题讨论】:
-
这里好像推导出0::Int
标签: haskell functional-programming