繁体   English   中英

F#模式匹配和功能

[英]F# Pattern matching and functions

我试图使用如下模式匹配在F#中实现斐波那契序列:

let fibonacci m=
    let rec fib = function
        | (0, _, z) -> z
        | (n, y, z) -> fib (n-1) z (y+z)
    fib m 0 1

在这里,我希望fib的第一个参数可以跟踪序列中的距离,接下来的两个参数是序列中的连续项。

但是,我在fib (n-1) z (y+z)上遇到编译时错误:

Type mismatch. Expecting a
    'a -> 'b -> 'c    
but given a
    'c    
The resulting type would be infinite when unifying ''a' and ''b -> 'c -> 'a'

我试过像这样指定类型:

let fibonacci m=
    let rec fib = function
        | (0, _, z:int) -> z
        | (n:int, y:int, z:int) -> fib (n-1) z (y+z)
    fib m 0 1

然后我在fib (n-1)上遇到了另一个编译错误:

This value is not a function and cannot be applied

我仍在努力使自己熟悉函数式编程。 我认为问题可能在于我对第一种模式的实际含义缺乏了解。 我希望它的意思是,当position参数为零时,它返回第二个参数项。

有人可以帮我解决这个问题,这显然是由于我的一些基本误解

问题是实际上定义为期望元组参数时,您正在使用带有咖喱参数的函数:

let fibonacci m =
    let rec fib = function
        | (0, _, z) -> z
        | (n, y, z) -> fib (n-1, z, y+z)
    fib (m, 0, 1)

这是因为您正在使用的function模式与单个参数匹配(在您的情况下针对元组)。 替代方法是使用match

let fibonacci m =
    let rec fib a b c = 
        match (a, b, c) with
        | (0, _, z) -> z
        | (n, y, z) -> fib (n-1) z (y+z)
    fib m 0 1

您可以将function视为单个参数函数的缩写,然后是该参数的match

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM