当用户输入数字m = 0时,程序将永远不会停止计数。有什么方法可以解决这个问题吗?因此,如果用户输入0,程序将结束。
import Control.Monad (replicateM)
transpose :: [[a]]->[[a]]
transpose ([]:_) = []
transpose x = (map head x) : transpose (map tail x)
.
.
.
答案 0 :(得分:4)
你错过了一个由输入0:
触发的转置案例transpose :: [[a]]->[[a]]
transpose [] = []
transpose ([]:_) = []
transpose x = (map head x) : transpose (map tail x)
以上情况非常危险,因为“头部”和“尾部”可能会失败:
transpose [[0],[]]
[[0, * 异常:Prelude.head:空列表
答案 1 :(得分:2)
您的转置函数不适用于表示为空列表[]
的空矩阵。
第一个等式,
transpose ([]:_) = []
只处理至少有一个空行的空矩阵。
第二种情况将无限递归一个空列表:
transpose [] = [] : transpose []
因此,在常规transpose x
等式之前再添加一个等式:
transpose [] = []