我正在努力在Haskell中编写一个简单的pi模拟,我想知道是否有一种方法可以使用replicateM并且不使用以下两篇文章中提到的其中一个软件包:
http://ptrckprry.com/blog/programming/2008/08/26/a-monte-carlo-monad-for-haskell/
https://www.fpcomplete.com/blog/2014/03/monte-carlo-haskell
如果存在用Haskell编写的pi的简单模拟,我想听听它 - 我也试过在GitHub上搜索。
-----编辑------
我试图重写Patrick Perry的例子中的unitBox部分,但我对liftM2的使用有误。我是不是在解释如何使用liftM2,还是使用random_2p?我对这一切都很陌生,很难看出我犯了什么错误。
这是我的代码:
import Numeric.GSL.Distribution.Continuous
import Control.Monad
unitbox :: (Double,Double)
unitbox = liftM2 (,) (random_2p Uniform 0 0 1)
(random_2p Uniform 0 0 1)
是错误信息:
Prelude Numeric.GSL.Distribution.Continuous> :l unitBox.hs
[1 of 1] Compiling Main ( unitBox.hs, interpreted )
unitBox.hs:5:18:
Couldn't match type ‘(a10, a20)’ with ‘Double’
Expected type: a10 -> a20 -> Double
Actual type: a10 -> a20 -> (a10, a20)
In the first argument of ‘liftM2’, namely ‘(,)’
In the expression:
liftM2 (,) (random_2p Uniform 0 0 1) (random_2p Uniform 0 0 1)
unitBox.hs:5:23:
Couldn't match expected type ‘(Double, a10)’
with actual type ‘Double’
In the second argument of ‘liftM2’, namely
‘(random_2p Uniform 0 0 1)’
In the expression:
liftM2 (,) (random_2p Uniform 0 0 1) (random_2p Uniform 0 0 1)
unitBox.hs:6:23:
Couldn't match expected type ‘(Double, a20)’
with actual type ‘Double’
In the third argument of ‘liftM2’, namely
‘(random_2p Uniform 0 0 1)’
In the expression:
liftM2 (,) (random_2p Uniform 0 0 1) (random_2p Uniform 0 0 1)
Failed, modules loaded: none.
感谢您的投入。
答案 0 :(得分:2)
random_2p
的返回类型为Double
而非m Double
,其中m
为Monad。因此,您不需要liftM2
对构造函数。
如果你看under the hood,所有这些函数都使用unsafePerformIO
,因此它们确实有效但由于某种原因呈现为纯粹。这样做非常不合时宜。我不知道这个库,但这对我来说有点红旗。