我想将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)]
答案 0 :(得分:5)
问题在于表达式
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
的元组,而不仅仅是两个单独的Int
。如果你真的想使用元组,你可以改为R 1 2
或uncurry R (1, 2)
。
答案 1 :(得分:3)
在Haskell中,函数和构造函数都是通过并置来应用的。例如,f x
是应用于参数f
的函数x
。 f x y
是应用于f
的函数x
,其结果应用于y
。您可以将f x y
视为f
应用于两个参数x
和y
。您不需要括号用于函数或构造函数应用程序,例如f (x y)
表示不同的东西 - 在这种情况下x
正在应用于y
,而f (x, y)
表示函数f
已应用于元组(x, y)
。
对于您的代码,您需要使用
R 2 4
代替R(2,4)
R (n x) (d x)
代替R(d n)x
当我们对这些语法进行更改时,equivalentes
将被写为
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)