gpt4 book ai didi

f# - 这个 F# 代码有什么问题

转载 作者:行者123 更新时间:2023-12-01 01:05:19 24 4
gpt4 key购买 nike

let compareDiagonal p x y =
System.Math.Abs((int)(x - (fst p))) <> System.Math.Abs((int)(y - (snd p)));;

let isAllowed p = function
| [] -> true
| list -> List.forall (fun (x, y) -> fst p <> x && snd p <> y && (compareDiagonal p x y)) list;;

let rec solve col list =
let solCount : int = 0
match col with
| col when col < 8 ->
for row in [0 .. 7] do
solCount = solCount + if isAllowed (row, col) list then solve (col + 1) ((row, col) :: list) else 0
solCount
| _ -> 1;;

let solCount = solve 0 [];;
solCount;;

我收到错误
 solCount = solCount + if isAllowed (row, col) list then (solve (col + 1) ((row, col) :: list)) else 0
------------^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

stdin(335,13): warning FS0020: This expression should have type 'unit', but has type 'bool'. If assigning to a property use the syntax 'obj.Prop <- expr'.

为什么我无法返回号码?

最佳答案

有两个相关的问题。

默认情况下,F# 变量是不可变的。如果你想要一个可变变量,你必须声明它,像这样:

let mutable solCount : int = 0

然后当你给它赋值而不是使用 =您必须使用 <-像这样:
solCount <- solCount + if isAllowed (row, col) list then solve (col + 1) ((row, col) :: list) else 0

接下来是一个完整的例子。

但是,这不是执行此类操作的正确功能方式。不要使用循环来累加值,而是使用递归函数随时返回累积值。以函数式程序的设计使用方式使用 F# 几乎总是会产生更好的结果,尽管需要一些时间来适应。

你原来的例子是可变的,而不是“功能方式”:
let compareDiagonal p x y =
System.Math.Abs((int)(x - (fst p))) <> System.Math.Abs((int)(y - (snd p)));;

let isAllowed p = function
| [] -> true
| list -> List.forall (fun (x, y) -> fst p <> x && snd p <> y && (compareDiagonal p x y)) list;;

let rec solve col list =
let mutable solCount : int = 0
match col with
| col when col < 8 ->
for row in [0 .. 7] do
solCount <- solCount + if isAllowed (row, col) list then solve (col + 1) ((row, col) :: list) else 0
solCount
| _ -> 1;;

let solCount = solve 0 [];;
solCount;;

关于f# - 这个 F# 代码有什么问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19341475/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com