gpt4 book ai didi

haskell - 如何使用 putStr Haskell 打印 2 个元素?

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

我是 Haskell 的新手,我想知道如何在 Haskell 中打印两个函数的结果,我会在 C++ 中这样做:

cout << f() << g();

或者在 C# 中:

Console.WriteLine(f() + " " + g());

在 Haskell 中我尝试了类似的东西

main =
--putStr ( show $ square 3 )
putStr ( show $ fibSeries 12 )

square :: Int -> Int
square x = x * x

fib :: Int -> Int
fib 0 = 0
fib 1 = 1
fib n = fib (n - 1) + fib (n - 2)

fibSeries :: Int -> [Int]
fibSeries x = map fib [0..x]

但我必须评论第一个命令,因为它给了我一个编译时错误。

错误是:

src\Main.hs:21:5:
Couldn't match expected type `(String -> IO ()) -> String -> t0'
with actual type `IO ()'
The function `putStr' is applied to three arguments,
but its type `String -> IO ()' has only one
In the expression:
putStr (show $ square 3) putStr (show $ fibSeries 12)
In an equation for `main':
main = putStr (show $ square 3) putStr (show $ fibSeries 12)

最佳答案

tl;dr你已经很接近了!

main = do
putStr ( show $ square 3 )
putStr ( show $ fibSeries 12 )

请注意,这不会插入任何空格,您可能希望插入 putStr ""

<小时/>

事情是这样的:Haskell 的主要部分,纯函数式语言,没有任何“计算/ Action 顺序”之类的东西。如果您使用诸如 print 5 之类的语句编写两行,它们只会被解析为一行,即

print 5 print 5

这意味着以下内容:print是一个函数,它接受参数5print5 ,并返回 main 的类型(一个 IO 操作)。所以类型需要类似于

type PrintType = Int -> PrintType -> Int -> IO()

这当然是无稽之谈。为了告诉 Haskell 你实际上想要对一系列操作进行排序(你在命令式语言中一直在做的事情,但在函数式编程中很少需要),我们有这个很好的do 表示法,它很有效(但并不总是完全!),就像您从命令式角度所期望的那样。

要了解它的实际工作原理,您需要了解 monad。这些在任何像样的 Haskell 教程中都有解释。阅读 LYAH或其他什么。

<小时/>

关于代码的进一步说明:实际上,按顺序执行这样的打印作业没有多大意义。您可以生成一个包含您想要的所有信息的字符串,然后一次性打印它:

main = putStrLn $ show (square 3) ++ " " ++ show (fibSeries 12)

或者,如果您对格式不太感兴趣,而只是对获取信息感兴趣,

main = print ( square 3, fibSeries 12 )

这将导致输出(9,[0,1,1,2,3,5,8,13,21,34,55,89,144])

关于haskell - 如何使用 putStr Haskell 打印 2 个元素?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17271398/

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