【问题标题】:F# Binary Arithmetic program.. type errorF#二进制算术程序..类型错误
【发布时间】:2015-10-24 07:32:47
【问题描述】:

我正在使用 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 那么 sum(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 列表 -> bool 列表 -> ('a * bool * bool -> bool -> bool) 列表

【问题讨论】:

    标签: f#


    【解决方案1】:

    您的括号和语法不正确,因此参数和函数的含义与预期不符(例如,在调用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:bool list -> l2:bool list -> bool list

    addc 的调用按预期工作:

    printfn "%A" (addc true [true;true;false] [false;false;false])
    

    看看这个SO post - F# function calling syntax confusion - 它解释了 F# 中的函数、函数调用和元组。

    【讨论】:

    • 很高兴这个答案有帮助
    • @ksw9722 作为答案的补充,如果 l1 恰好是一个空列表而不是 l2 (因为您将在 then 部分结束 l1.Headl1.Tail 会引发错误)
    【解决方案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
    

    【讨论】:

      猜你喜欢
      • 2020-10-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-02-10
      • 2011-01-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多