gpt4 book ai didi

Haskell,如何在函数中打印值和返回

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

我尝试编写带有数组并对其进行迭代的自定义函数,我需要打印每个数字并递归启动相同的函数,但出现错误

parse error on input `main'



代码:
firstitem n = if n /= [] n firstitem( tail n )


main = do
print(firstitem [1,2,3])

最佳答案

您的第一个问题是 if 的语法错误。陈述。你应该写

firstItem n = if {- condition-}
then {- do this -}
else {- do that -}

二、不清楚函数 firstItem是什么应该做的。听起来它应该返回列表的第一项,但您的描述看起来好像您想要遍历列表的所有元素。

您可以将迭代和打印组合成一个函数,如下所示:
printAll xs = if null xs        -- If the list is empty
then return () -- then we're done, so we quit.
else do print (head xs) -- Otherwise, print the first element
printAll (tail xs) -- then print all the other elements.

main = printAll [1,2,3]

函数 null返回 True如果列表为空,则返回 False .声明 return ()你可以认为是“没有什么要处理的,所以现在停止函数并且不返回任何结果”。第三行和第四行包含一个“do block ”。 do block 基本上是绑定(bind)两个 Action 的胶水 print (head xs)printAll (tail xs)一起成为一个 Action 。您可以用花括号编写它以使其更清晰:
do {
print (head xs);
printAll (tail xs)
}

尽管您实际上并不需要它们-缩进指定了您的意思。

这解决了你的问题,但它有点笨拙。毕竟,Haskell 应该是一门漂亮的语言——所以让我们让你的代码更漂亮吧!最好使用模式匹配将列表分成头部和尾部:
printAll []     = return ()
printAll (x:xs) = do print x
printAll xs

那好多了。但它可以更加模块化。嘿,也许我们可以创建一个通用函数,将 Action 作为输入,并对列表的每个元素执行该 Action :
repeatedly f []     = return ()
repeatedly f (x:xs) = do f x
repeatedly f xs

printAll xs = repeatedly print xs

那很整齐。但实际上,已经有一个函数可以做到这一点。它被称为 mapM_ (它被称为这个是有充分理由的,但我现在不会进入它)它在 Control.Monad模块:
import Control.Monad

printAll xs = mapM_ print xs

实际上,您可以省略 xs参数,编译器可以推断它应该在那里:
printAll = mapM_ print

最后,你的代码很漂亮。希望有点帮助。

关于Haskell,如何在函数中打印值和返回,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12909456/

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