我是F#的原始初学者,所以请原谅我这个问题是愚蠢的还是已经被问过我甚至不理解的方式,但是我已经阅读了我的基础知识了现在几次,我试图做一些与有效的例子几乎完全相同的事情,但事实并非如此。我正在尝试创建一个函数来确定具有n个成员的集合的可能组合(无序)的数量,对于大小为1 ... n的子集。
let factorial n = [1..n] |> List.reduce (*)
printfn "3! = %d" (factorial 4) // Works fine
let combinations m n = (factorial m / (factorial (m - n ) * factorial n))
printfn "%d" (combinations 6 4) // Also works fine
let cn n = [1..5] |> List.map (combinations 6)
cn 5 |> List.sum |> printfn "%d" // Works as well, we're almost where i want to be...
let cn' n = [1..n] |> List.map (combinations n)
cn' 6 |> List.sum |> printfn "%d" // System.ArgumentException: The input list was empty.
这些功能有何不同?是因为我使用参数n
作为范围规范的一部分吗?或者作为"烘焙"部分应用函数中的参数?我可以看到第一个函数cn
具有签名cn : n:'a -> int list
,而cn'
具有签名cn' : n:int -> int list
。不幸的是,我不知道这意味着什么,但为什么用变量替换文字会改变这样的签名?这是我做的事情最明智的方式吗?
答案 0 :(得分:2)
问题实际上隐藏在您的定义中,请注意您在cn
中
1..5
和combinations 6
。
您可能希望cn'
与1..(n-1)
匹配。