【问题标题】:F# List.map type errorF# List.map 类型错误
【发布时间】:2018-04-10 01:48:18
【问题描述】:

对于 F#,因为我不能在 List.map 中使用 if 语句,所以我尝试使用辅助函数。如果所有值 y 和 z 都大于或小于中位数,它将返回所有值 y、z 作为 c1 或 c2。但是我在第 12 行遇到类型错误,其中 let L = "..." for "10 20" 表示“预期类型单元但给定类型 int”。不太确定如何解决这个问题。任何建议将不胜感激。

       let hold y z median c1 c2 =
           if  (y > median) && (z > median) then
             (c1, c1)
           else if  (y <= median) && (z <= median) then
             (c2, c2)
       //line 10
       let holder =
           let L = L |> List.map (fun (y,z) -> (hold y z median 10 20, hold y z median 10 20) 
           L

【问题讨论】:

  • 您缺少elseelse 0 添加到hold。在 F# 中,if-else 是表达式而不是语句。

标签: f#


【解决方案1】:

由于代码和逻辑不一致,您要达到的目标并不完全清楚。但是,您需要考虑这种情况,当您的 if 不匹配时,您会分支到 else。这必须与if 分支的类型相同,原因很明显。如果省略,则为unit

let hold y z median c1 c2 =            
        if  ((y > median) && (z > median)) then (c1,c1)
        elif ((y <= median) && (z <= median)) then (c2,c2)
        else (y,z)

let holder xs median =
    xs |> List.map (fun (y,z) -> (hold y z median 10 20, hold y z median 10 20, hold y z median 10  20)) 

let xs = [(20,40);(1,2)]
let med = 10

holder xs med  

您也可以使用match 来描述这个逻辑。但是,如果我们坚持使用if,那么没有什么能阻止您在List.map 中使用它。这是一个例子:

xs
|> List.map (fun (x,y) ->
                          if x > 10 then (x , x)
                          elif y >= 10 then (y , y)
                          else (x,y) )

老实说,如果它很复杂,您可以将其排除在外。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-10
    • 1970-01-01
    • 2015-03-18
    • 2016-10-30
    • 1970-01-01
    • 2011-04-01
    相关资源
    最近更新 更多