Haskell用户定义的数据类型

0 haskell types haskell-platform

我想将R数据的种类定义为有理数,其中R是(分母,分子),我定义为:

data R = R {n::Int,
            d::Int} deriving Show
Run Code Online (Sandbox Code Playgroud)

现在我尝试做一个函数给出两个参数(一个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
Run Code Online (Sandbox Code Playgroud)

我的想法是返回这样的东西:

> equivalentes'[R(2,4),R(3,5),R(4,8)] (R(1,2))
                   [R (2,4),R (4,8)]
Run Code Online (Sandbox Code Playgroud)

bhe*_*ilr 5

问题在于表达方式

R (d n) x : equivalentes' xs r
Run Code Online (Sandbox Code Playgroud)

特别是

d n
Run Code Online (Sandbox Code Playgroud)

n函数具有类型R -> Int,d函数也是如此,但您已将nd作为参数传递给它.也许你的意思是

R (d x) x
Run Code Online (Sandbox Code Playgroud)

但既然x有类型R,这也行不通,所以你可能有意思

R (d x) (n x)
Run Code Online (Sandbox Code Playgroud)

或类似的东西.


另一方面,你做不到R (1, 2),因为(1, 2)是两个Ints 的元组,而不仅仅是两个单独的Ints.你可以做R 1 2,或者uncurry R (1, 2)如果你真的想使用元组.