【发布时间】:2014-03-22 04:17:24
【问题描述】:
我正在学习 Haskell 并编写一个程序来解决一个玩具问题。该程序使用的参数k 在运行时不会更改,在从文件中读取参数之后。我对使用纯函数很陌生,我想尽可能多地编写纯函数。
我有一个数据类型Node,以及比较节点、获取节点后代等的函数。目前,所有这些函数都将参数k作为参数,例如
compare k node1 node2 = ...
desc k node = ...
每当我必须在函数中递归调用其中任何一个时,我都必须重复 k 参数。这似乎是多余的,因为 k 对这些函数永远不会有不同的值,而且它会降低类型签名的可读性,如果可能的话,我想重构它。
有没有什么策略可以用纯函数做到这一点,或者这只是我必须处理的限制?
我的想法
之前我在顶层对 k 进行了硬编码,它似乎可以工作(我能够在函数中使用 k 而无需将其作为显式参数)。但是,一旦我需要从文件中读取输入,这显然是不可行的。
另一种可能的策略是在 main 函数中定义所有这些函数,但在 Haskell 中似乎强烈反对这样做。
【问题讨论】:
-
您需要
k做什么?除非它是诸如自定义比较函数之类的东西,否则节点之间的比较依赖于除节点本身之外的任何内容,这听起来有点奇怪。 -
@duplode 我使用
k来计算desc中一个节点的后代,我在递归调用compare时使用它,如果这有意义的话 -
这很有道理。这些名字让我想到了影响结果的额外参数听起来很可疑的上下文(
compare标准函数,树中的节点),但这可能只是我。无论如何,关于纯度的一个好处是签名倾向于更好地反映实际的依赖关系(例如,从desc的类型来看,结果可能取决于k的值)。
标签: haskell monads purely-functional pure-function