相关疑难解决方法(0)

为什么我们需要monad?

我谦虚地看到着名问题"什么是单子?"的答案.,特别是投票最多的人,试着解释什么是monad而没有明确解释为什么monad真的是必要的.他们可以解释为问题的解决方案吗?

monads haskell

358
推荐指数
7
解决办法
5万
查看次数

打印Haskell是一个纯函数吗?

在Haskell中打印是一个纯函数; 为什么或者为什么不?我认为这不是因为它并不总是返回与纯函数应该相同的值.

io monads haskell pure-function io-monad

7
推荐指数
2
解决办法
688
查看次数

如何从数学角度看待高阶函数和 IO 动作?

我试图从第一原则来理解函数式编程,但我仍然停留在纯函数世界和具有状态和副作用的不纯现实世界之间的接口上。从数学的角度来看,

  • 什么是返回函数的函数?
  • 什么是返回 IO 操作的函数(如 Haskell 的 IO 类型)?

详细说明:在我的理解中,纯函数是从域到共域的映射。最终,它是从计算机内存中的某些值到内存中的某些其他值的映射。在函数式语言中,函数是声明式定义的;即,它们描述了映射,但不描述需要对特定输入值执行的实际计算;后者由编译器来推导。在具有空闲内存的简化设置中,运行时将没有计算;相反,编译器可以在编译时为每个函数创建一个查找表。执行一个纯程序相当于查表。因此,组合函数相当于构建更高维的查找表。当然,拥有计算机的全部意义在于设计出无需逐点查找表即可指定函数的方法 - 但我发现心智模型有助于区分纯函数和效果。但是,我很难将这种心智模型应用于高阶函数:

  • 对于将另一个函数作为参数的函数,生成的将值映射到值的一阶函数是什么?是否有它的数学描述(我确定有,但我既不是数学家也不是计算机科学家)。
  • 返回函数的函数怎么样?我如何才能在心理上“扁平化”这个构造以再次获得将值映射到值的一阶函数?

现在到令人讨厌的现实世界。与它的交互并不纯粹,但没有它,就没有合理的程序。在我上面的简化心智模型中,分离程序的纯部分和不纯部分意味着每个函数式程序的基础是一层命令式语句,这些语句从现实世界中获取数据,对其应用纯函数(进行查表),以及然后将结果写回现实世界(磁盘、屏幕、网络等)。

在 Haskell 中,这种与现实世界的命令式交互被抽象为IO 操作,编译器根据它们的数据依赖性对它们进行排序。但是,我们不会直接将程序编写为一系列命令式 IO 操作。相反,有些函数会返回 IO 操作(类型为 的函数:: IO a)。但据我所知,这些不可能是真正的功能。这些是什么?如何根据上面概述的心智模型最好地思考它们?

io haskell functional-programming purely-functional higher-order-functions

2
推荐指数
1
解决办法
185
查看次数