gpt4 book ai didi

haskell - 在运行的 haskell 程序中生成输出

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

来自(SWI)Prolog,我发现让 Haskell 即时给出输出非常困难。

最简单的例子,我希望 Haskell 在每次迭代时打印一些内容:

fac 0 = 1  
fac n = fac ( n-1 ) * n

或者我想从一个永不停止的程序中获取输出...

-- A possible halt statement...  
-- find_primes l 100 = l
find_primes l n = if ( is_prime l n ) then find_primes nn s else find_primes l s
where s = n + 1
nn = n:l

is_prime :: Integral a => [a] -> a -> Bool
is_prime [] n = True --print the prime number on the fly
is_prime (h:t) n = if ( r /= 0 ) then is_prime t n else False
where r = n mod h

前奏> find_primes [ ] 2

最佳答案

您有三个选择:

首先:将 IO 传播到各处,并像使用奇特的命令式语言一样使用 Haskell 进行编写。

fac 0 = putStrLn "0! = 1" >> return 1
fac n = do
x <- fac (n - 1)
let r = x * n
putStrLn $ show n ++ "! = " ++ show r
return r

第二:使用unsafePerformIO及其衍生物(例如Debug.Trace)。对于搬起石头砸自己的脚和调试目的很有用。

第三:不要在代码中混合 I/O 和计算,而是延迟生成一个[可能无限]的数据结构,其中包含纯函数中的中间结果并单独使用它。例如,阶乘的无限列表可以写为:

facs = scanl (*) 1 [1..]

并按如下方式使用,以产生与上例中调用 fac 10 相同的结果:

forM_ (take 11 $ zip [0..] facs) $ \(i, x) ->
putStrLn $ show i ++ "! = " ++ show x

关于haskell - 在运行的 haskell 程序中生成输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7214005/

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