返回值以中断函数

时间:2016-11-22 13:54:31

标签: f# functional-programming

我是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#函数?

2 个答案:

答案 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