我已经阅读了这个问题,并认为这个算法不是最优的.例如,'f 20 100'返回的列表如[85,14,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0]; 结果我经常得到一个很长的零尾.
好吧,我认为这是一个有趣的任务,并决定创建自己的实现:)
我决定以随机比例划分数字:
g 1 sum = return [sum]
g n sum = do
prop <- randomRIO(0.0, 1.0)
k1 <- g (round prop * n) (round( prop * sum))
k2 <- g (n - (round prop * n)) (sum - (round prop * sum))
return k1 ++ k2
Run Code Online (Sandbox Code Playgroud)
但我的代码不起作用:
Couldn't match expected type `IO [a0]' with actual type `[a1]'
In the expression: return k1 ++ k2
In the expression:
do { prop <- randomRIO (0.0, 1.0);
k1 <- g (round prop * n) (round (prop * sum));
k2 <- g (n - (round prop * n)) (sum - (round prop * sum));
return k1 ++ k2 }
In an equation for `g':
g n sum
= do { prop <- randomRIO (0.0, 1.0);
k1 <- g (round prop * n) (round (prop * sum));
k2 <- g (n - (round prop * n)) (sum - (round prop * sum));
.... }
Run Code Online (Sandbox Code Playgroud)
正如我所见,我无法连接IO列表.我该如何解决?
您询问的类型错误是由您应该写的事实引起的
return (k1 ++ k2)
Run Code Online (Sandbox Code Playgroud)
而不是
return k1 ++ k2
Run Code Online (Sandbox Code Playgroud)
请注意,这return只是Haskell中的一个函数,并且函数应用程序比任何其他中缀运算符更强大,因此您的代码读取到Haskell,就像您已经编写
(return k1) ++ k2
Run Code Online (Sandbox Code Playgroud)
但请注意,您的代码还存在其他问题.