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)
所以我正在学习 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)