在Haskell中,您可以拥有不返回任何内容的函数吗?
在 Haskell 中,您可以拥有不返回任何内容的函数吗?如果是这样,是否有这样的例子?
回答
不可以。但是,您可以使用返回微不足道的值的函数。该()类型只有一个居民,()。这与 C 的void返回概念非常相似。(我一直觉得这void是一个不好的名字,因为从概念上讲,确实有一个居民而不是零。)
这是返回的标准函数():
foo :: Int -> String -> ()
foo _ _ = ()
这个看起来不太有用,但实际上可以有返回()并有用的函数,例如rnf.
但是,在几乎所有出现此问题的情况下,您都会对这种IO ()类型感到更加兴奋。这是一种与世界进行一些有趣交互的过程,但不会产生任何有趣的信息供以后消费。该类型的居民IO ()比该类型的居民多很多()。例如:
bar :: IO ()
bar = do
putStrLn "What's your name?"
s <- getLine
putStrLn $ "Hello, " ++ s ++ "!"
但是关于术语的一句话:这不是大多数人使用该词的方式的“函数”——毕竟,它不能传递任何参数!
这两个特征——功能和程序——可以有利地混合在一起。如果您从命令行以外的其他地方获取名称,您可能需要参数化上述过程,如下所示:
baz :: String -> IO ()
baz name = putStrLn $ "Hello, " ++ name ++ "!"
这是一个返回过程的函数,该过程与世界交互,然后产生一个无趣的()值。