【发布时间】:2015-11-13 04:27:21
【问题描述】:
我有一些软件设计经验,我现在正在学习 Haskell。在许多现实世界的软件开发中,都会遇到类似给定的情况,例如,如下所示:
假设,我有这个代码
f1 a b c d = e
where
e1 = f2 b c (f3 a)
e2 = f4 d
e = e1 + e2
f2 b c d = n + c + d
where
n = f5 b
f5 n = n*n
f3 a = a * 2
f4 a = a + 3
现在,如果我想更改 f5 使其接受另一个参数,我将不得不更改所有函数链直到 f1。 如下图所示。注意添加的参数 x。
f1 a b c d x = e -- f1 needs to be changed
where
e1 = f2 b c (f3 a) x
e2 = f4 d
e = e1 + e2
f2 b c d x = n + c + d -- f2 needs to be changed
where
n = f5 b x
f5 n x = n*n -- f5 changed (**bang**)
f3 a = a * 2
f4 a = a + 3
这是做这种事情的正常 Haskell 方式还是有更好(更 Haskell 风格)的方式? 我知道 API 的这种变化会干扰客户端代码,但是如何将影响保持在最低限度,有什么 Hasekll 方法吗?
在更一般的层面上:Haskell 在这种情况下的表现如何(特别是考虑到它的不可变状态特性)?在这方面它为开发人员提供了什么?还是 Haskell 本身在这方面没有任何作用,而这只是一个我们必须跟上的困难软件工程问题(没有未来证明之类的东西)?
对于在一篇帖子中提出多个问题,我深表歉意,但我无能为力,因为这些问题相互关联。另外,我找不到类似的问题,如果我可能错过了,很抱歉。
【问题讨论】:
-
好吧,你总是可以改变类型签名和参数列表(你正在编写类型签名,不是吗?),然后看看编译器抱怨的地方。修复第一个点,然后返回步骤 2,直到所有错误都耗尽。如果您有一组传递给许多函数的通用参数,那么创建一个新的数据类型来保存所有这些值可能会更好,那么您可以避免更改函数参数,而只需更改该类型的定义。这是一个软件问题,而不是真正的 Haskell 问题。
标签: haskell design-patterns refactoring idioms