haskell - 我们可以在 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 行的重复?
我希望我的问题是有道理的。
谢谢你。
解决方案
您可以构造一个辅助函数,将两个函数作为输入: 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
然后我们可以使用该模式来定义h1
through 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
推荐阅读
- linux - 如何在 Linux 的 VS CODE 中打开我的 GIT REPO
- javascript - php 获取 document.getelementbyid 的值
- c# - Visual Studio 有时会在 PC 重新启动后重建未修改的项目
- javascript - 避免在第一次 ajax 调用完成之前通过 ajax 请求提交多个表单
- java - 为什么在while循环中等待条件?
- jquery - 获取数组 jquery 中单个 JSON 对象值的总和
- python - python "is" 和 "==" 问题
- dialogflow-es - 如何在对话流中构建许多问题意图
- android - 如何以编程方式在 LinearLayout 中添加边距/填充?
- c - 替换linux内核中使用的container_of宏