haskell - Haskell 评估
问题描述
我有以下代码块:
data G = F G G | H Int deriving (Show, Eq)
example :: Int -> G -> G
example 0 (H i) = (H i)
example n (H i) = F (example (n-1) (H i)) (example (n-1) (H i))
example n (F i1 i2) = F (example n i1) (example n i2)
当我运行example 0 (F (H 1) (H 2))
时,它按预期返回F (H 1) (H 2)
当我运行时example 1 (F (H 1) (H 2))
,它会返回F (F (H 1) (H 1)) (F (H 2) (H 2))
这不是我想要的。我需要返回F (F (H 1) (H 1)) (H 2)
我的意思是在第 6 行example n (F i1 i2) = F (example n i1) (example n i2)
,我调用了递归函数两次。但是我希望在我们评估之前先(example n i1)
评估并更新变量n
(example n i2)
对此确切问题的任何帮助/解决方案将不胜感激。我已经尝试了几个小时,但成功率为零。
解决方案
问题似乎是您想使用example
'update' n
。但是,您不能直接这样做,因为example
返回一个G
值,并且n
是一个Int
.
那么,您似乎需要一个函数G -> Int
。问题是没有明确正确的方法来编写该函数。事实上,有无数种可能的实现方式。这是一个示例:
evalZero :: G -> Int
evalZero = const 0
evalOne :: G -> Int
evalOne = const 1
evalLeft :: G -> Int
evalLeft (H i) = i
evalLeft (F g _) = evalLeft g
evalRight :: G -> Int
evalRight (H i) = i
evalRight (F _ g) = evalRight g
evalSum :: G -> Int
evalSum (H i) = i
evalSum (F g1 g2) = evalSum g1 + evalSum g2
evalProduct :: G -> Int
evalProduct (H i) = i
evalProduct (F g1 g2) = evalProduct g1 * evalProduct g2
evalPlusOneProduct :: G -> Int
evalPlusOneProduct (H i) = i + 1
evalPlusOneProduct (F g1 g2) = evalPlusOneProduct g1 * evalPlusOneProduct g2
-- etc.
如图evalPlusOneProduct
所示,您可以任意添加或减去一个常量Int
,或者就此而言,乘以一个常量,或者执行更复杂的任意计算。因为有无限多的整数,所以有无限多的实现(虽然,从技术上讲,我们受到范围的限制Int
)。
一旦你弄清楚如何转换G
成Int
,就可以使用该函数从左值和左值计算n1
新n
值G
。
推荐阅读
- docker - Docker Airflow 中没有 BS4 模块
- ruby-on-rails-6 - Rails 6.0 的多数据库使用
- elasticsearch - Elasticsearch 计算不同的嵌套值
- python-3.x - 无论如何我可以在python中生成一个无限的四个字符串列表
- batch-file - TextTransform.exe - 从 cmd 运行时如何传递 $(TargetDir)?
- android - Android Studio北极狐:更新gradle错误后
- django - 如何检查当前页面是主页还是模板 django 中的特殊页面?
- docker - 仅当主机文件存在时,是否可以将主机文件挂载到 docker 容器?
- python - 这是使用 lambda 和 map 函数执行这段代码的正确方法吗
- metadata - 对于 python 或 C++ 程序文件,我正在寻找添加的元信息