-1

以下是 set 的定义方式:

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

4

1 回答 1

1

第一个问题

您的集合定义为

newtype Set a = ...

这意味着它Set有 kind * -> *,换句话说,你需要给它一个类型来参数化它。

想起来像

 template<typename T>
 class foo{};

这个词foo本身是没有意义的。

既然你使用Ints everywere 我假设你想要

 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

错了,这传递了return2 个参数,你想要

 return (Set foo)

另外,getSetI似乎制作了m随机集,然后尝试将它们归为一个IO (Set (Set Int)),您到底想要做什么?

于 2013-09-28T17:09:53.897 回答