我正在尝试使用UnionFind package,因为我需要这个结构用于练习(聚类节点,编号为1 ... 500)(尽管此blog post表明它没有帮助)并且了解ST。
我的第一个问题是该软件包似乎没有批量加载初始数据的功能。因此,我创建了以下内容(基于http://www.haskell.org/haskellwiki/Monad/ST中的foldST示例)来初始化数据结构,但我找不到一种令人信服的方式来调用initialClustering
并且没有简单的方法来查看是否有数据结构已经创建。
import Control.Monad
import Control.Monad.ST
import qualified Data.UnionFind.ST as UF
type Start = Int
--Union-find: clusters of Nodes
type Cluster = UF.Point [Start]
main = do
let
-- next line is clearly wrong but can't find another way to run function
iCluster = initialClustering [1..500]
print $ UF.repr [5] -- i
print $ UF.repr (UF.Pt [5]) -- ii
return ()
initialClustering :: [t] -> ()
initialClustering xs = runST $ do
forM_ xs $ \x -> do
UF.fresh [x]
但是我做错了,因为编译失败了i)
Couldn't match expected type `UF.Point s0 a0'
with actual type `[t1]'
In the first argument of `UF.repr', namely `[5]'
和ii)
Not in scope: data constructor `UF.Point'
这反映了对ST和用于创建UnionFind.ST库的新类型的基本缺乏理解。