我使用F#编程二进制算术程序。我不认为我的代码错了,但发生了类型错误。
请检查我的代码并告诉我出了什么问题。
let carry a b c = if a then b||c else b&&c
let sum a b c = (if c then (a=b) else not (a=b))
let rec addc cin (l1:bool list) (l2:bool list) =
if l2.Length>0 then sum(cin,l1.Head,l2.Head)::addc(carry cin,l1.Head,l2.Head), l1.Tail, l2.Tail) else l1
错误消息:
如果l2.Length> 0则 总和(CIN,l1.Head,l2.Head):: ADDC(进位(CIN,l1.Head,l2.Head),l1.Tail,l2.Tail) 否则l1
-------------------------------------------------- ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^stdin(173,51):错误FS0001:此表达式应具有类型 (' a * bool * bool - > bool - > bool)列表但这里有类型 bool list - > bool list - > (' a * bool * bool - > bool - > bool)列表
答案 0 :(得分:3)
您的括号因此您的语法不正确,因此参数和函数的含义不符合预期(例如,在调用sum
函数时,您使用一个元组参数调用它而不是三个参数)。调整括号可以纠正问题,然后代码按预期编译:
let carry a b c = if a then b||c else b&&c
let sum a b c = (if c then (a=b) else not (a=b))
let rec addc cin (l1:bool list) (l2:bool list) =
if l2.Length > 0 then
(sum cin l1.Head l2.Head) :: (addc (carry cin l1.Head l2.Head) l1.Tail l2.Tail)
else
l1
val addc:cin:bool - > l1:布尔列表 - > l2:布尔列表 - >布尔列表
对addc
的调用按预期工作:
printfn "%A" (addc true [true;true;false] [false;false;false])
看看这个SO post - F# function calling syntax confusion - 它解释了F#中的函数,函数调用和元组。
答案 1 :(得分:2)
你的函数'carry'和'sum'不带元组,所以'addc'可以重写为
let carry a b c = if a then b||c else b&&c
let sum a b c = if c then a=b else not (a=b)
let rec addc cin (l1:bool list) (l2:bool list) =
if l2.Length>0
then sum cin l1.Head l2.Head :: addc (carry cin l1.Head l2.Head) l1.Tail l2.Tail
else l1
编译到
val carry : a:bool -> b:bool -> c:bool -> bool
val sum : a:'a -> b:'a -> c:bool -> bool when 'a : equality
val addc : cin:bool -> l1:bool list -> l2:bool list -> bool list