如何使用putStrLn进行跟踪(Haskell)

Ell*_*tus 4 monads haskell unsafe-perform-io

我试图通过添加对"putStrLn"的调用来获取Haskell函数以显示它何时应用:

isPrime2 1 = False

isPrime2 n = do
    putStrLn n
    null (filter (==0) (map (mod n) (filter isPrime2 [2..(floor (sqrt(fromIntegral (n-1))))])))
Run Code Online (Sandbox Code Playgroud)

(最终目标是证明为什么一个版本的isPrime比另一个版本更有效.)

当我将上面的代码加载到GHCi中时,我收到错误:

无法将预期类型Bool与实际类型匹配m0 b0

我确定这是一个n00b错误.有人能告诉我正确的方法来完成我想要做的事情吗?

fuz*_*fuz 16

问题是,Haskell严格区分函数,如(+)map不纯的行为,如putStrLnmain.当给定相同的输入而不修改任何东西时,纯函数应该总是产生相同的结果.这显然禁止PutStr和朋友一起使用.类型系统实际上强制执行这种分离.每个执行IO或以任何方式不纯的函数都会IO在它的类型前面粘贴.


TL;博士; trace从模块中使用Debug.Trace:

import Debug.Trace

isPrime2 1 = False
isPrime2 n = show n `trace` null (filter (==0) (map (mod n) (filter isPrime2 [2..(floor (sqrt(fromIntegral (n-1))))])))
Run Code Online (Sandbox Code Playgroud)

但要注意结果可能相当令人惊讶,因为无法保证您的代码实际运行; trace的参数可以运行一次或两次或任何其他次数.