首页 > 解决方案 > 在 Haskell 中,你可以拥有什么都不返回的函数吗?

问题描述

在 Haskell 中,你可以拥有什么都不返回的函数吗?如果是这样,有这样的例子吗?

标签: haskellfunctional-programming

解决方案


不可以。但是,您可以使用返回微不足道值的函数。该()类型只有一个居民,(). 这与 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 ++ "!"

这是一个返回过程的函数,该过程与世界交互,然后产生一个无趣的()值。


推荐阅读