2017-03-11 49 views
0

說我有這樣的類型之一:哈斯克爾:獲取替代型

data Cell = Empty | Full 

是否哈斯克爾提供了一個簡單的方法來調用非確定性的一個或另一個這些構造的?基本上我試圖隨機調用哪個構造函數,例如[CellOfSomeType | i <- [1..somerange]]

+0

提示:'Empty'和'Full'是值,而不是你需要調用的函數(就像在OOP中一樣)。 – MasterMastic

+0

好的,那麼如何隨機獲取其中的一個值? – zzu

+0

使用['random'](http://hackage.haskell.org/package/random)包或其他選項。不好意思,我會提供更多的幫助,但我缺乏時間。 – MasterMastic

回答

3

只需獲取一個隨機位,並根據該位將值設置爲FullEmpty。例如:

import System.Random 

你似乎在談論System.Random,但這類信息應包括在這一問題。

data Cell = Full | Empty 
      deriving (Eq,Ord,Show,Enum) 

我推導Enum與遠程隨機使用。現在我們要爲Random類定義一個實例,以便您可以使用幾個公共庫生成Cell類型的隨機值。 Random類要求我們至少定義randomrandomR方法。

instance Random Cell where 
    random g = let (a,g') = random g 
       val = if a then Full else Empty 
      in (val,g') 
    randomR (l,h) g = let (a,g') = randomR (fromEnum l, fromEnum h) g 
        in (toEnum a, g') 

因爲你的類型是相同的Bool我們就可以生成一個隨機布爾(位),然後選擇您的兩個構造中的一個。範圍隨機更麻煩一點,但我們只是在請求的下限和上限之間生成一個Int,然後獲取與Int值匹配的構造函數。