我们可以在 Haskell 中定义一类函数定义吗?

Hug*_*ier 1 haskell design-patterns typeclass

很抱歉我因为缺乏更好的词语而选择了这个标题。

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

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
Run Code Online (Sandbox Code Playgroud)

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

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

我希望我的问题有意义。

谢谢。

Wil*_*sem 6

您可以构造一个辅助函数,将两个函数作为输入: 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
Run Code Online (Sandbox Code Playgroud)

然后我们可以使用该模式来h1定义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
Run Code Online (Sandbox Code Playgroud)

  • 甚至可以写成 `h1, h2, h3 :: (Integer, Integer) -> Integer; [h1, h2, h3] = zipWith 助手 [f1, f2, f3] [g1, g2, g3]`。 (4认同)