Haskell中的简单pi模拟 - 使用replicateM

时间:2015-05-17 23:22:00

标签: haskell

我正在努力在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.

感谢您的投入。

1 个答案:

答案 0 :(得分:2)

random_2p的返回类型为Double而非m Double,其中m为Monad。因此,您不需要liftM2对构造函数。

如果你看under the hood,所有这些函数都使用unsafePerformIO,因此它们确实有效但由于某种原因呈现为纯粹。这样做非常不合时宜。我不知道这个库,但这对我来说有点红旗。