2016-04-26 84 views
0

我有一个非常简单的函数叫做'fold',它接受函数f并执行它。给定一个函数'add'和两个数字,它会调用这两个数字并显示结果。但是由于下面的编译错误,我无法编译它。什么是错误,具体说明和我能做些什么来解决它?Haskell - 传递一个函数作为参数编译错误

module Main where 

    add x y = x + y 

    --fold :: ((a,b)->c) -> a->b->c 

    fold f n x = f n x 


    main :: IO() 
    main = do 
     fold add 2 3 

enter image description here

+0

您声明'main'应该返回'IO()'。 'fold add 2 3'返回什么?你怎么能把返回的值变成'IO()'? –

+0

如果我将IO()更改为Integer,则会给出“无法与实际类型'Integer'匹配的预期类型'IO t0'” – BDillan

回答

6

的问题是,你声明main(正确地)具有类型IO(),但fold不返回。该错误消息稍微复杂一点,因为理论,add(因此fold)可能会返回类型为IO()的值,因为add可以使用Num实例返回任何类型。然而,IO()而不是Num的实例。解决方法是返回从fold的返回值创建的IO操作。一种方法是使用print函数(该函数在输出Show实例的同时将其转换为String)。

main = print $ fold add 2 3