Haskell 为什么;“全部”;是给我这个",;不能';与预期类型“不匹配”;?
命令:Haskell 为什么;“全部”;是给我这个",;不能';与预期类型“不匹配”;?,haskell,map,matrix,Haskell,Map,Matrix,命令: m = [[1,0,0],[2,-3,0],[4,5]] t all@(x:xs) = let (m, n) = (length all, length x) in all (==n) (map length all) 给出: t m 您将名称all绑定到整个列表,因此前奏曲函数all不再可见。选择一个不同的名称,或者删除all@,只需使用let(m,n)=(长度xs+1,…)或类似的名称即可 相关的:你为什么要计算所有的长度?您不会在任何地方使用它。您将名称all绑定到整个列表,因
m = [[1,0,0],[2,-3,0],[4,5]]
t all@(x:xs) = let (m, n) = (length all, length x) in all (==n) (map length all)
给出:
t m
您将名称
all
绑定到整个列表,因此前奏曲函数all
不再可见。选择一个不同的名称,或者删除all@
,只需使用let(m,n)=(长度xs+1,…)
或类似的名称即可
相关的:你为什么要计算所有的
长度
?您不会在任何地方使用它。您将名称all
绑定到整个列表,因此前奏曲函数all
不再可见。选择一个不同的名称,或者删除all@
,只需使用let(m,n)=(长度xs+1,…)
或类似的名称即可
相关的:你为什么要计算所有的
长度
?您不能在任何地方使用它。原因是,您将符号all
重新定义为t
的参数。因此,本地all
会对全局all
产生阴影,您会得到此错误。作为解决方案,尝试为本地all
另起一个名称。原因是,您将符号all
重新定义为t
的参数。因此,本地all
会对全局all
产生阴影,您会得到此错误。作为一个解决方案,试着给你的本地all
取另一个名字。我认为Haskell足够聪明,除了阴影之外,还可以理解“all”的不同语义。悲哀的Thanks@Gremo:它是否应该猜测您所指的潜在众多所有中的哪一个?一个名字指的是一件事,这是一件好事——有利于复杂性预算,有利于简单性,有利于对代码进行推理。@delnan:这只是我作业中的一个步骤,试图检查矩阵m是否有效(每行的列数相等)。(m,n)是retval。@Gremo:真正的问题是,如果haskell猜,它可能猜错了,你的程序可能是不可预测的。但是您可以使用类型类让编译器猜测,但不是按照您希望的方式。@fuzzxl:TypeClass严格来说不是猜测,因为(标准非扩展)Haskell中的(afaik)类型推断必须始终为给定程序生成一个正确的结果,所以只有一个类型(类)这是可以推断的。我认为哈斯凯尔足够聪明,除了阴影之外,他还能理解“所有”的不同语义。悲哀的Thanks@Gremo:它是否应该猜测您所指的潜在众多所有中的哪一个?一个名字指的是一件事,这是一件好事——有利于复杂性预算,有利于简单性,有利于对代码进行推理。@delnan:这只是我作业中的一个步骤,试图检查矩阵m是否有效(每行的列数相等)。(m,n)是retval。@Gremo:真正的问题是,如果haskell猜,它可能猜错了,你的程序可能是不可预测的。但是您可以使用类型类让编译器猜测,但不是按照您希望的方式。@fuzzxl:TypeClass不是猜测,严格来说,因为(标准非扩展)Haskell中的(afaik)类型推断必须始终为给定程序生成一个正确的结果,所以只能推断一个类型(类)。
Couldn't match expected type `(Int -> Bool) -> [Int] -> t'
against inferred type `[[a]]'
In the expression: all (== n) (map length all)
In the expression:
let (m, n) = (length all, length x) in all (== n) (map length all)
In the definition of `t':
t (all@(x : xs))
= let (m, n) = ... in all (== n) (map length all)