print 将以下函数作为参数

print regards following functions as arguments

所以我正在学习 Haskell 并且有一个更广泛的程序,我想要 运行,但我设法缩小了为什么它不能解决这个问题的原因:

putSentence:: String -> IO ()
putSentence sentence = print sentence

func 0 =  putSentence "Sample Text."
func x = if 3 == x then putSentence "Three." func (x-1) else putSentence "Not three." func (x-1)

以上代码无法编译,因为 putSentence 将以下 func (x-1) 作为附加参数。这是我第一次 Haskell 这样做,我已经尝试用括号和 $ 改变优先级,但没有找到修复它的方法,因此不胜感激。

您需要一个 do 块才能对 IO 个动作进行排序*

试试这个:

func 0 = putSentence "Sample Text."
func x = if 3 == x
            then do
               putSentence "Three."
               func (x-1)
            else do
               putSentence "Not three."
               func (x-1)

*严格来说这不是真的,因为 do 块只是 monadic 函数的语法糖,主要是 (>>=) 运算符。但是 do 符号通常是最简单和最易读的方式,当然也是您第一次学习时最容易理解的方式。

为了更好地理解在Haskell中做简单的输入和输出,我推荐以下chapter优秀的Learn You a Haskell。事实上,我会推荐整本书。

表达式

putSentence "Three." func (x-1)

使用三个参数调用 putSentence"Three."func(x-1)。这是错误的。

你可能想要做的是一个接一个地执行IO动作。为此,您可以使用 >>:

putSentence "Three." >> func (x-1)

或者,使用 do 块:

do putSentence "Three."
   func (x-1)

例如

func x = if 3 == x
   then do
      putSentence "Three."
      func (x-1)
   else do
      putSentence "Not three."
      func (x-1)