Haskell用户定义的数据类型
我想把R数据定义为有理数,其中R是(分母,分子),我定义为:Haskell用户定义的数据类型,haskell,types,haskell-platform,Haskell,Types,Haskell Platform,我想把R数据定义为有理数,其中R是(分母,分子),我定义为: data R = R {n::Int, d::Int} deriving Show 现在我试着做一个函数,给出两个参数(一个R和一个R的列表),并返回一个与R等价的列表。我试着这样做,但给出了一个类型错误 equivalentes' :: [R] -> R -> [R] equivalentes' [] _ = [] equivalentes' (x:xs) r | (n x `mod`
data R = R {n::Int,
d::Int} deriving Show
现在我试着做一个函数,给出两个参数(一个R和一个R的列表),并返回一个与R等价的列表。我试着这样做,但给出了一个类型错误
equivalentes' :: [R] -> R -> [R]
equivalentes' [] _ = []
equivalentes' (x:xs) r
| (n x `mod` n r == 0) && (d x `mod` d r == 0) = (R(d n)x): equivalentes' xs r
| otherwise = equivalentes' xs r
我的想法是返回如下内容:
> equivalentes'[R(2,4),R(3,5),R(4,8)] (R(1,2))
[R (2,4),R (4,8)]
问题在于这个表达式
R (d n) x : equivalentes' xs r
特别是
d n
n
函数的类型为R->Int
,d
函数也是如此,但是您已经将n
传递给d
作为其参数。也许你的意思是
R (d x) x
但是由于x
的类型是R
,所以这也不起作用,所以您可能是指
R (d x) (n x)
或者类似的东西
另一方面,您不能执行
R(1,2)
,因为(1,2)
是两个Int
s的元组,而不仅仅是两个独立的Int
s。如果您真的想使用元组,可以改为r12
,或者uncurry R(1,2)
。在Haskell中,函数和构造函数都是通过并置应用的。例如fx
是应用于参数x
的函数f
fxy
是应用于x
的函数f
,其结果应用于y
。您可以将fxy
视为f
应用于两个参数,x
和y
。函数或构造函数应用程序不需要括号,例如f(xy)
表示不同的含义-在本例中x
应用于y
,而f(x,y)
表示应用于元组(x,y)
的函数f
对于您的代码,您需要使用
而不是r24
R(2,4)
而不是R(nx)(dx)
R(dn)x
等价物
将被编写为
equivalentes :: [R] -> R -> [R]
equivalentes [] _ = []
equivalentes (x:xs) r
| (n x `mod` n r == 0) && (d x `mod` d r == 0) = R (n x) (d x): equivalentes xs r
| otherwise = equivalentes xs r
equivalentes [R 2 4,R 3 5,R 4 8] (R 1 2)
你的例子可以写成
equivalentes :: [R] -> R -> [R]
equivalentes [] _ = []
equivalentes (x:xs) r
| (n x `mod` n r == 0) && (d x `mod` d r == 0) = R (n x) (d x): equivalentes xs r
| otherwise = equivalentes xs r
equivalentes [R 2 4,R 3 5,R 4 8] (R 1 2)
@Cirdec`无法将预期的类型
R'与实际类型匹配
R->Int'…`您已经向我们展示了名为等价函数的定义
(末尾有一个”
),但是它的实现和您的示例调用引用了等价函数
(没有“
)。另一个函数的定义在哪里?@jwodder你说得对!我已经修好了。当我复制并粘贴时会发生这种情况当你开始工作时,你可能会惊讶于等价物[r4 9](r2 3)
的结果。事实上,这种错误很难发现,这就是为什么不应该对字段使用单字母名称的原因(或者其他全局范围内的名称)@Rhymoid我甚至认为这是你不应该这样做的另一个原因,但更重要的是,你应该使用描述性名称,这样人们一眼就能知道代码在做什么。我假设这可能是数据比率=比率{分子::Int,分母::Int}
,但只有在查看代码以了解OP试图做什么之后。如果一开始使用类似的名称,就不会有混淆。