我的Haskell文件中有以下函数:
notFound :: () -> IO ()
notFound = putStr "Sorry, your command could not be found"
该功能无法编译。这是我得到的编译错误:
todos.hs:27:12:
Couldn't match expected type ‘() -> IO ()’ with actual type ‘IO ()’
Possible cause: ‘putStr’ is applied to too many arguments
In the expression: putStr "Sorry, your command could not be found"
In an equation for ‘notFound’:
notFound = putStr "Sorry, your command could not be found"
但是以下功能可以:
notFound :: IO ()
notFound = putStr "Sorry, your command could not be found"
问题:
根据我对类型签名的理解,看起来它们是相同的,()
意味着没有参数传递给函数。那不是这样吗?如果不是,那么函数签名中的()
是什么意思呢?
答案 0 :(得分:4)
()
是空元组。它不是什么都没有,它更像是C语言中的void类型或长度为零的固定长度列表。与() :: ()
类似,只有一个类型为Bool
的对象。
为什么会这样?一般来说,我已经看到它过去常常关闭"类型中的一个变量。因此IO ()
是IO
操作,它始终返回相同的内容:()
。
一个可能更好的例子是:Conduit a IO b
需要一些类型a
对象的流,并将其转换为b
个对象的流。但是如果你有什么东西不接受输入流怎么办?您可以将其表示为Conduit () IO b
至"关闭"输入流。 (我这里的定义松散而快速,但我认为它或多或少都有效)
答案 1 :(得分:1)
您的from mpi4py import MPI
函数定义的函数采用类型notFound
的值,并返回类型()
的值。 IO()
是()
类型的唯一值。你的功能是无意识的无点符号
()
相当于
notFound :: () -> IO ()
notFound = putStr "Sorry, your command could not be found"
这显然不起作用,因为函数notFound :: () -> IO ()
notFound () = putStr "Sorry, your command could not be found" ()
不接受putStrLn
作为第二个参数。
您当然可以将其定义为
()
这会编译,但是相当荒谬,因为它需要作为notFound :: () -> IO ()
notFound () = putStr "Sorry, your command could not be found"
调用。
你真正想要的只是IO动作,而不是功能。因此,您可以将其定义为notFound ()
。