我是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 ) ] )
我做错了什么?
答案 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
来调用它。