Haskell无守卫实现帕斯卡三角取值函数,修复if表达式语法报错
Haskell 帕斯卡三角代码修复指南
存在的问题
- 语法错误:函数定义参数列表后缺失等号。Haskell 中无守卫的函数定义必须遵循
函数名 参数列表 = 函数体的格式,原代码中pascal row pos后直接跟 if 表达式,编译器会将 if 识别为传入函数的参数,因此触发意料之外的 if 表达式报错。 - 类型不匹配错误:函数签名声明返回值为
Int类型,但边界条件分支返回了字符串"1",需要改为数值1。 - 逻辑错误:合法性判断规则写反。需求是
pos必须小于等于row,因此只有当pos > row时才需要抛出非法输入错误,原代码的row > pos判断会直接拦截所有合法输入。 - 边界逻辑缺失:帕斯卡三角每行最后一个元素(
pos == row)的值固定为 1,缺少该判断会导致合法的末尾位置查询递归到非法参数报错。
修复后的完整代码
pascal :: Int -> Int -> Int pascal row pos = if row == 0 || pos == 0 || pos == row then 1 else if pos > row then error "Invalid input." else pascal (row-1) (pos-1) + pascal (row-1) pos
验证效果
调用 pascal 2 1 会返回预期结果 2,调用 pascal 3 4 会抛出非法输入错误,完全符合需求。
内容的提问来源于stack exchange,提问作者Plex
相关产品推荐
相关产品推荐

