F#List.map类型错误

时间:2018-04-10 01:48:18

标签: f#

对于F#因为我不能在List.map中使用if语句,所以我尝试使用辅助函数。如果所有值y和z都大于或小于中值,则它将所有值y,z返回为c1或c2。但我在第12行遇到了类型错误,其中L =" ..."为" 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

1 个答案:

答案 0 :(得分:0)

由于代码和逻辑没有对齐,所以你想要实现的目标并不完全清楚。但是,当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) )

说实话,如果它很复杂,你就应该把它考虑在内。