gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 02:31:02 27 4
gpt4 key购买 nike

我试图通过添加对“putStrLn”的调用来显示一个 Haskell 函数:

isPrime2 1 = False

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

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

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

Couldn't match expected type Bool with actual type m0 b0



我确定这是一个 n00b 错误。有人可以告诉我完成我想做的事情的正确方法吗?

最佳答案

问题是,Haskell 对纯函数有严格的区分,例如 (+)。和 map和不纯的行为,例如 putStrLnmain .当给定相同的输入并且不修改任何内容时,纯函数应该始终产生相同的结果。这显然禁止使用 PutStr和 friend 。类型系统实际上强制执行这种分离。每个执行 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))))])))

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

关于haskell - 如何使用 putStrLn 进行跟踪(Haskell),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7650139/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com