haskell - 在 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 ++ "!"
这是一个返回过程的函数,该过程与世界交互,然后产生一个无趣的()
值。
推荐阅读
- unity3d - 如何防止so文件中的so文件被黑客入侵
- sql - 如何计算sql中不同字符串的重叠?
- laravel - laravel 应用程序在控制器中具有相同的方法
- javascript - Fetch():请求正文格式错误
- python - 如何使用 tensorflow-serving 和 RESTful API 服务再训练模型
- charts - 图形多色区域线
- python - Django 组选项列表
- jenkins - 部署服务器的 Jenkins 参数化选择
- android - 自定义 AppCompatButton 在 Android 5 (Api 21) 上得到错误的颜色
- google-app-engine - 如何在 GAE 服务部署阶段使用 webpack 构建我的源代码?