Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Haskell用户定义的数据类型_Haskell_Types_Haskell Platform - Fatal编程技术网

Haskell用户定义的数据类型

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`

我想把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` 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试图做什么之后。如果一开始使用类似的名称,就不会有混淆。