在Haskell中写一个传递闭包关系函数
Write a transitive closure relation function in Haskell
我应该为 return 关系的传递闭包函数编写一个函数。这是我到目前为止写的:
relTrans :: [(Integer, Integer)] -> [(Integer, Integer)]
relTrans rel | rel == remove_dups(rel ++ relComp (remove_dups rel) (remove_dups rel)) = rel
| otherwise = relTrans remove_dups(rel ++ relComp (remove_dups rel) (remove_dups rel))
这里提到的作为remove_dups和relComp的函数如下-
relComp :: [(Integer, Integer)] -> [(Integer, Integer)] -> [(Integer, Integer)]
relComp r1 r2 = [(a,c) | (a,k1)<-r1, (k2,c)<-r2, k1 == k2]
remove_dups :: [a] -> [a]
remove_dups [] = []
remove_dups (x:xs) = x : remove_dups (removeElem x XS)
removeElem :: a -> [a] -> [a]
removeElem n [] = []
removeElem n (m:zs) = if (n == m) then removeElem n zs else m:(removeElem n zs)
但是,我不断收到以下错误:-
* Couldn't match expected type `[(Integer, Integer)]
-> [(Integer, Integer)]'
with actual type `[(Integer, Integer)]'
* The function `relTrans' is applied to two arguments,
but its type `[(Integer, Integer)] -> [(Integer, Integer)]'
has only one
In the expression:
relTrans
remove_dups (rel ++ relComp (remove_dups rel) (remove_dups rel))
In an equation for `relTrans':
relTrans rel
| rel
== remove_dups (rel ++ relComp (remove_dups rel) (remove_dups rel))
= rel
| otherwise
= relTrans
remove_dups (rel ++ relComp (remove_dups rel) (remove_dups rel))
|
183 | | otherwise = relTrans remove_dups(rel ++ relComp (remove_dups rel) (remove_dups rel))
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
还有这个错误-
* Couldn't match expected type `[(Integer, Integer)]'
with actual type `[a0] -> [a0]'
* Probable cause: `remove_dups' is applied to too few arguments
In the first argument of `relTrans', namely `remove_dups'
In the expression:
relTrans
remove_dups (rel ++ relComp (remove_dups rel) (remove_dups rel))
In an equation for `relTrans':
relTrans rel
| rel
== remove_dups (rel ++ relComp (remove_dups rel) (remove_dups rel))
= rel
| otherwise
= relTrans
remove_dups (rel ++ relComp (remove_dups rel) (remove_dups rel))
|
183 | | otherwise = relTrans remove_dups(rel ++ relComp (remove_dups rel) (remove_dups rel))
| ^^^^^^^^^^^
有人可以帮我解决为什么会出现这些错误吗?
您似乎想在这里使用 C 风格的函数应用程序:
relTrans remove_dups(rel ++ relComp (remove_dups rel) (remove_dups rel))
-- here ^
In Haskell 将 relTrans
函数应用于两个参数:remove_dups
和 (rel ++ ...)
,但是 relTrans
只有一个参数,所以你得到一个错误。
你可能打算写这个:
relTrans (remove_dups (rel ++ relComp (remove_dups rel) (remove_dups rel)))
我应该为 return 关系的传递闭包函数编写一个函数。这是我到目前为止写的:
relTrans :: [(Integer, Integer)] -> [(Integer, Integer)]
relTrans rel | rel == remove_dups(rel ++ relComp (remove_dups rel) (remove_dups rel)) = rel
| otherwise = relTrans remove_dups(rel ++ relComp (remove_dups rel) (remove_dups rel))
这里提到的作为remove_dups和relComp的函数如下-
relComp :: [(Integer, Integer)] -> [(Integer, Integer)] -> [(Integer, Integer)]
relComp r1 r2 = [(a,c) | (a,k1)<-r1, (k2,c)<-r2, k1 == k2]
remove_dups :: [a] -> [a]
remove_dups [] = []
remove_dups (x:xs) = x : remove_dups (removeElem x XS)
removeElem :: a -> [a] -> [a]
removeElem n [] = []
removeElem n (m:zs) = if (n == m) then removeElem n zs else m:(removeElem n zs)
但是,我不断收到以下错误:-
* Couldn't match expected type `[(Integer, Integer)]
-> [(Integer, Integer)]'
with actual type `[(Integer, Integer)]'
* The function `relTrans' is applied to two arguments,
but its type `[(Integer, Integer)] -> [(Integer, Integer)]'
has only one
In the expression:
relTrans
remove_dups (rel ++ relComp (remove_dups rel) (remove_dups rel))
In an equation for `relTrans':
relTrans rel
| rel
== remove_dups (rel ++ relComp (remove_dups rel) (remove_dups rel))
= rel
| otherwise
= relTrans
remove_dups (rel ++ relComp (remove_dups rel) (remove_dups rel))
|
183 | | otherwise = relTrans remove_dups(rel ++ relComp (remove_dups rel) (remove_dups rel))
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
还有这个错误-
* Couldn't match expected type `[(Integer, Integer)]'
with actual type `[a0] -> [a0]'
* Probable cause: `remove_dups' is applied to too few arguments
In the first argument of `relTrans', namely `remove_dups'
In the expression:
relTrans
remove_dups (rel ++ relComp (remove_dups rel) (remove_dups rel))
In an equation for `relTrans':
relTrans rel
| rel
== remove_dups (rel ++ relComp (remove_dups rel) (remove_dups rel))
= rel
| otherwise
= relTrans
remove_dups (rel ++ relComp (remove_dups rel) (remove_dups rel))
|
183 | | otherwise = relTrans remove_dups(rel ++ relComp (remove_dups rel) (remove_dups rel))
| ^^^^^^^^^^^
有人可以帮我解决为什么会出现这些错误吗?
您似乎想在这里使用 C 风格的函数应用程序:
relTrans remove_dups(rel ++ relComp (remove_dups rel) (remove_dups rel))
-- here ^
In Haskell 将 relTrans
函数应用于两个参数:remove_dups
和 (rel ++ ...)
,但是 relTrans
只有一个参数,所以你得到一个错误。
你可能打算写这个:
relTrans (remove_dups (rel ++ relComp (remove_dups rel) (remove_dups rel)))