首页 > 解决方案 > 我们可以在 Haskell 中定义一类函数定义吗?

问题描述

对不起,我选择了这个标题,因为缺少更好的词。

这是我感兴趣的函数定义模式的典型示例:

h1 :: (Integer, Integer) -> Integer
h1 (x, 0) = f1 x
h1 (x, n) = g1 (x, n)

h2 :: (Integer, Integer) -> Integer
h2 (x, 0) = f2 x
h2 (x, n) = g2 (x, n)

h3 :: (Integer, Integer) -> Integer
h3 (x, 0) = f3 x
h3 (x, n) = g3 (x, n)



f1 :: Integer -> Integer
f1 x = x
g1 :: (Integer, Integer) -> Integer
g1 (x, n) = x

f2 :: Integer -> Integer
f2 x = 0
g2 :: (Integer, Integer) -> Integer
g2 (x, n) = 0

f3 :: Integer -> Integer
f3 x = 2*x
g3 :: (Integer, Integer) -> Integer
g3 (x, n) = x*n

如您所见,第 1 行到第 11 行是重复的,并展示了 h1、h2 和 h3 共有的函数定义方案(和类型)。该方案由以下定义完成。如果我可以说,第二部分包含实际的“定义内容”。

有没有办法定义一类函数定义来避免前 11 行的重复?

我希望我的问题是有道理的。

谢谢你。

标签: haskelldesign-patternstypeclass

解决方案


您可以构造一个辅助函数,将两个函数作为输入: anf和 a g,然后实现该模式。因此,这样的助手看起来像:

helper :: (Eq b, Num b) => (a -> c) -> ((a, b) -> c) -> (a, b) -> c
helper f g = go
    where go (x, 0) = f x
          go xn = g xn

然后我们可以使用该模式来定义h1through h3

h1 :: (Integer, Integer) -> Integer
h1 = helper f1 g1

h2 :: (Integer, Integer) -> Integer
h2 = helper f2 g2

h3 :: (Integer, Integer) -> Integer
h3 = helper f3 g3

推荐阅读