如何生成随机集? (Haskell的)

时间:2013-09-28 17:04:47

标签: haskell

以下是如何定义集合:

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

1 个答案:

答案 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)),您希望它完全按照这个做什么?