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
和不纯的行为,如putStrLn
和main
.当给定相同的输入而不修改任何东西时,纯函数应该总是产生相同的结果.这显然禁止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的参数可以运行一次或两次或任何其他次数.