类型''列表'不支持运营商'+'

时间:2015-10-24 23:49:28

标签: f# functional-programming type-inference currying

下面的

auxInner返回一个int列表。但是当我在随后的List.sum(auxInner xs ys)函数中调用inner时,我得到了这个奇怪的错误!不List.sum采用整数列表吗?

let rec auxInner xs ys =
    match (xs, ys) with
    |([],[]) -> []
    |([], ys) -> ys
    |(xs, []) -> xs
    |(x::xs, y::ys) -> x*y::auxInner xs ys

let rec inner xs ys = 
    match (xs, ys) with
    |([],[]) -> []
    |([], ys) -> ys
    |(xs, []) -> xs
    |(xs, ys) -> List.sum(auxInner xs ys)

1 个答案:

答案 0 :(得分:2)

inner的其他模式会返回一个列表,因此List.sum(auxInner xs ys)也必须返回一个列表 另一方面,List.sum在类型上使用一些定义的(+)来进行求和。
这个总和必须是如前所述的列表,所以我们需要一种方法来以某种方式对列表求和 由于没有为列表定义(+),您会收到该错误消息。

很有可能你必须在匹配的每种情况下都返回一个int,或者在每种情况下都返回一个列表,可能是单个[List.sum (auxInner xs ys)]但没有上下文......