首页 文章

F#List.map类型错误

提问于
浏览
0

对于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

    它's not exactly clear what you are trying to achiveve as the code and the logic doesn'吨排队 . 但是,当 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) )
    

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

相关问题