首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >是否可以使用IO monad编写大部分代码

是否可以使用IO monad编写大部分代码
EN

Stack Overflow用户
提问于 2012-10-16 12:51:52
回答 3查看 1K关注 0票数 8

我正在尝试开发一个使用Haskell的聊天服务器。

有很多有用的工具,如TChanTSkiplistforkIO ...etc,但我的大部分代码都是在IO monads和unsafePerformIO中编写的,这听起来效率很低。

是否可以这样做,或者haskell不是用于此目的的正确工具?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-10-16 14:20:01

作为一般规则,尝试先将编写的代码作为纯函数编写,而不用担心数据来自哪里-只要假设它就在那里。

接下来,将纯函数包装在IO中,为纯函数提供数据,并将结果放在某个地方。在聊天应用程序中有一大堆这样的是可以接受的!IO monad一点也不低效,只是我们喜欢尽可能多地保留代码,因为这是一个好的设计--让数据从IO中分离出来。聊天应用程序不会对其获得的数据进行大量计算,因此可以使用大量IO代码。

我认为坚持使用IO monad肯定比使用unsafePerformIO更好,因为unsafePerformIO将其结果呈现为纯数据。我可能很想用它来从配置文件中获取常量,但我从来没有这样做过,而且如果您在大量使用IO monad,那就没有意义了。它被称为“不安全”是有原因的!Petr Pudlák在下面的评论中有很好的建议。

我听过哈斯克尔的单曲被描述为世界上的best imperative programming language。我可以对这种描述指手画脚,但我同意这种观点,是的,坚持使用Haskell。Haskell擅长你正在使用它的编程。

票数 19
EN

Stack Overflow用户

发布于 2012-10-16 13:19:59

每当您注意到有一个驻留在IO monad中的长函数时,暂停并查看所发生的计算是值得的。在我的经验中,(几乎)总是有一些与IO无关的东西在运行,这些东西不需要访问输入输出,可以封装在纯函数中。

这有一个很大的好处,它迫使你找到适当的抽象,并将(纯)算法从输入/输出处理中分离出来。此外,验证和测试纯函数要容易得多。当然,您仍然会从一些IO a函数(例如main)中调用这些纯函数,但这是非常好的。

票数 12
EN

Stack Overflow用户

发布于 2012-10-16 22:46:09

我的大部分代码都是在IO monads内部编写的

这很好。

和unsafePerformIO

那太糟糕了!避免像使用瘟疫一样使用unsafePerformIO;它只应该由经验丰富的Haskellers在非常特定的情况下使用。

是否可以这样做,或者haskell不是用于此目的的正确工具?

在IO monad中编写代码是可以的,但使用unsafePerformIO是不行的。相反,学习如何使用Monad接口(do表示法)编写IO操作。了解哪些函数类型签名需要包含IO类型。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12907714

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档