Haskell中test1函数求值顺序疑问:++调用结果不符预期
关于Haskell test1函数求值结果的疑问
作为Haskell新手,我无法理解下述test1函数的求值过程:
test1 1 ls = ls test1 p ls = test1 (p - 1) ls ++ [p]
我推导test1 3 []的过程如下,认为结果应为[3, 2],但在GHCi中运行得到的结果却是[2, 3],请问这是为什么?
{- test1 3 [] = test1 2 []++[3] = test1 1 []++[3]++[2] -}
问题出在你的推导步骤上
你在展开test1 2 []时犯了错误:根据函数定义test1 p ls = test1 (p-1) ls ++ [p],当p=2时,应该是test1 1 [] ++ [2],而非test1 1 [] ++ [3] ++ [2]。
正确的推导过程如下:
test1 3 [] = test1 2 [] ++ [3] = (test1 1 [] ++ [2]) ++ [3] = ([] ++ [2]) ++ [3] = [2] ++ [3] = [2, 3]
核心逻辑是:每次递归都会把当前的p拼在递归调用结果的后面。当计算test1 3 []时,先得到test1 2 []的结果[2],再把[3]拼在其后,最终得到[2,3]。
内容的提问来源于stack exchange,提问作者Gustavo Machala
相关产品推荐
相关产品推荐

