对于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
答案 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) )
说实话,如果它很复杂,你就应该把它考虑在内。