Seq.find返回'a - > int而不是int

时间:2013-08-08 14:57:13

标签: f# functional-programming

我是F#的新手。我正在尝试创建一个F#程序,将数字转换为罗马数字对应物。

type RomanDigit = I | IV | V | IX
let rec romanNumeral number =
    let values = [ 9; 5; 4; 1 ]
    let toRomanDigit x =
        match x with
        | 9 -> IX
        | 5 -> V
        | 4 -> IV
        | 1 -> I
    let capture x =
        values
        |> Seq.find ( fun x -> number >= x )
    match number with
    | 0 -> []
    | int -> Seq.toList ( Seq.concat [ [ toRomanDigit capture ]; romanNumeral ( number - capture ) ] )

我的问题是捕获的类型为'a - > int,但我希望它有int类型,考虑到Seq.find将返回一个int。特别是,我随后的捕获调用引发了一个错误,特别是在:

| int -> Seq.toList ( Seq.concat [ [ toRomanDigit capture ]; romanNumeral ( number - capture ) ] )

我做错了什么?

2 个答案:

答案 0 :(得分:4)

capture应该是值而不是函数吗?如果是,请删除参数:

let capture =
    values
    |> Seq.find ( fun x -> number >= x )

答案 1 :(得分:4)

let capture x =
    values
    |> Seq.find (fun x -> number >= x)

将被理解为:

capture成为一个函数,它给出一个输入x,忽略输入而是返回 values |> Seq.find (fun x -> number >= x)。所以,可能你想要

let capture = values |> Seq.find (fun x -> number >= x)

let capture values = values |> Seq.find (fun x -> number >= x)

在后一种情况下,它是一个正常的功能,您可以使用capture values而不是capture来调用它。