【发布时间】:2019-12-02 05:36:59
【问题描述】:
我有以下代码块:
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更新n?n是Int,但example返回G值。您不能将G值绑定到Int变量。 -
有没有办法解决这个问题?甚至不使用一些辅助函数?
-
“我希望(例如 n i1)首先评估并更新变量 n。”
n“之后”(example n i1)应该使用什么值? -
虽然
example n (F i1 i2) = F (example n i1) i2似乎与您的测试用例相匹配。根本不清楚,你想要什么。您的问题缺少规范。 -
写一个帮助器
exampleH :: Int -> G -> (G, Int),将n作为输入,并在返回的对中返回“更新的”n作为输出。
标签: haskell functional-programming