以下是如何定义集合:
module SetOrd (Set(..),emptySet,isEmpty,inSet,subSet,insertSet,
deleteSet,powerSet,takeSet,(!!!),list2set,unionSet)
where
import Data.List (sort)
{-- Sets implemented as ordered lists without duplicates --}
newtype Set a = Set [a] deriving (Eq,Ord)
instance (Show a) => Show (Set a) where
showsPrec _ (Set s) str = showSet s str
showSet [] str = showString "{}" str
showSet (x:xs) str = showChar '{' ( shows x ( showl xs str))
where showl [] str = showChar '}' str
showl (x:xs) str = showChar ',' (shows x (showl xs str))
然后我想系统生成一个随机集,如:
getSetInt :: IO Set
getSetInt = do
d <- getRandomInt 10
n <- getRandomInt 5
m <- getRandomInt 5
getSetI d n m
getSetI :: Int -> Int -> Int -> IO Set
getSetI _ _ 0 = return (Set [])
getSetI d n m = do
f <- getRandomSet d n
fs <- getSetI d n (m-1)
return (Set (f:fs))
getRandomSet :: Int -> Int -> IO Set
getRandomSet _ 0 = return (Set [])
getRandomSet d n = do
f <- getRandomInt d
fs <- getRandomSet d (n-1)
return (Set (f:fs))
但是我的代码出了点问题。
Expecting one more argument to "Set"
In the type signature for "getSetInt": getSetInt :: IO Set
答案 0 :(得分:1)
您的设置定义为
newtype Set a = ...
这意味着Set
有* -> *
种,换句话说,你需要传递一种类型才能进行参数化。
想想它
template<typename T>
class foo{};
foo
这个词本身就没有意义。
因为你正在使用Int
,所以我假设你想要
IO (Set Int)
接下来在getSetI
中,
fs <- getSetI d n (m-1)
应该是
Set fs <- getSetI d n (m-1)
因为你想使用底层列表,而不是后面代码中的Set
接口。
此外,你永远不会提到getRandomInt
是什么,但假设它的作用类似于
getRandomInt a = randomRIO (0, a)
来自random
包。
其余的代码实际上包含大约10-12个错误,所以我不打算在这里描述每个错误。主要是那个
return Set foo
错了,这会传递return
2个参数,你想要
return (Set foo)
此外,getSetI
似乎会使m
个随机集,然后尝试将它们归为IO (Set (Set Int))
,您希望它完全按照这个做什么?