Haskell 如何分隔两个语句(或分号的等效语句)

Haskell 如何分隔两个语句(或分号的等效语句),haskell,Haskell,这是打印奇数平方和的代码。奇数平方的列表在下面的列表中,如何打印 将其作为一个额外的行添加到末尾,会导致编译错误,因为show函数调用被视为sum函数的参数。您不能这样做,但您当前使用的类型除外。在这种情况下,我也不建议更改类型。Haskell在类型级别区分了只计算值的代码和有副作用的代码,例如打印到屏幕上。一开始这是一个奇怪的概念,但它对代码的推理非常有帮助,即使在没有强制执行它的语言中,我在Python中经常使用这种策略。相反,请编写另一个将打印该值的函数,例如 oddSquareSum :

这是打印奇数平方和的代码。奇数平方的列表在下面的列表中,如何打印


将其作为一个额外的行添加到末尾,会导致编译错误,因为show函数调用被视为sum函数的参数。

您不能这样做,但您当前使用的类型除外。在这种情况下,我也不建议更改类型。Haskell在类型级别区分了只计算值的代码和有副作用的代码,例如打印到屏幕上。一开始这是一个奇怪的概念,但它对代码的推理非常有帮助,即使在没有强制执行它的语言中,我在Python中经常使用这种策略。相反,请编写另一个将打印该值的函数,例如

oddSquareSum :: Integer
oddSquareSum =
    let oddSquares = filter odd $ map (^2) [1..]
        belowLimit = takeWhile (<10000) oddSquares
    in  sum belowLimit
    --extra code to print the list of integers
    show belowLimit

然后,您可以在加载源文件后从GHCi运行printAnswer,或者您可以让main调用printAnswer,然后将文件编译成可执行文件。如果要使用GHCi,您可以完全跳过编写此包装,直接在控制台中键入oddSquareSum查看其值。

为了完整性,如果您只想输入一些临时代码进行调试,既不想更改签名也不想拆分函数,您还可以选择从调试使用traceShow。跟踪:


那么你想要什么样的输出呢?一方面,您需要了解Haskell如何选择在其静态类型系统中表示IO效果。另一方面,您可能正在寻找@sibi,以打印临时列表-belowLimit值,如[1 9 25….]etcNote,它显示不打印结果。相反,它将它转换为一个字符串,这样它就可以再次计算回原始值。。。我正试图打印一条调试语句以查看列表的值,如下所示。我可以把oddSquareSum的类型改为IO。@MadhavanKumar为什么不把它分解成一个单独的函数呢?我发现,如果你想知道中间值,那么它足够复杂,可以作为一个独立的计算。编写一个计算belowLimit的函数,并打印该函数的结果。是的,这意味着你的文件中会有很多小的代码,但是haskell通常很容易重构,保持它的分解也会使它更易于重用。
printAnswer :: IO ()        -- The IO means that this can have side effects
printAnswer = print oddSquareSum

oddSquareSum :: Integer
oddSquareSum =
    let oddSquares = filter odd $ map (^2) [1..]
        belowLimit = takeWhile (<10000) oddSquares
    in sum belowLimit
import Debug.Trace (traceShow)

oddSquareSum :: Integer
oddSquareSum =
    let oddSquares = filter odd $ map (^2) [1..]
        belowLimit = takeWhile (<10000) oddSquares
    in  traceShow belowLimit $ sum belowLimit