我是F#的新手(今天开始使用它)和相对较新的函数式编程(我对Lisp有一点经验)。我想通过在满足某个条件时返回一个值来退出函数,这样就不会执行循环的其余部分。这是我想要做的C#插图:
bool CheckRow (int n, int i)
{
for(int j = 0; j < 9; j++)
if (n == sudoku[i][j])
return false;
return true;
}
我尝试在F#中实现相同的功能,这样(sudoku是一个array2D):
let CheckRow (n : int) (i : int) : bool =
for j = 0 to 8 do
if (n = sudoku.[i, j]) then
false
true
但是,我在if中得到以下错误:&#34;这个表达式应该有类型单位但是这里有类型bool&#34;。什么是&#34;返回&#34;的正确方法。来自F#函数?
答案 0 :(得分:3)
通常你不应该提前破坏函数,而是在某种情况下结束递归,否则递归调用函数。这里递归可能是隐藏的,因为你在列表或矩阵上运行。
require 'test_helper'
class CalculatorControllerTest < ActionDispatch::IntegrationTest
test "response" do
get calculate_path(money: 25)
assert_equal 200, response.status
assert_select "#result", "1"
end
end
是在列表上实现递归并在第一次返回结果的函数之一。你可以用这种方式写你的功能:
List.forall
答案 1 :(得分:3)
高阶函数当然很好,但在某些时候有人必须编写一个循环(例如实现高阶函数),并且最终会成为你,所以它很好知道如何在F#中编写循环。 F#中的for
循环没有提前返回,但其他类型的循环确实允许这样做:
// While loop, imperative style
let checkRow n i =
let mutable clear = true
let mutable j = 0
while clear && j < 9 do
clear <- n <> sudoku.[i, j]
j <- j + 1
clear
// Tail-recursive style - more idiomatic F#
let checkRow n i =
let rec loop j =
if j = 9 then true
elif sudoku.[i, j] = n then false
else loop (j + 1)
loop 0