2012-10-22 50 views
0

我想創建一個名爲結構可以用來表示字符串,整數列表的結構數據類型。例如,結構如下:[Int,String,Int,[Int]]。哈斯克爾,創建一個結構化的數據類型

問題1:如何創建此數據類型?

data Structured = ... 

問題2:所謂確認,確認輸入的功能滿足的限制,並具有確認::限制的簽名類型 - >結構 - >也許布爾

+1

這是功課嗎?你有什麼嘗試? – dave4420

+0

有什麼可能的限制嗎? 「確認」的'Maybe Bool'結果是什麼意思?在這種情況下,「Nothing」意味着什麼?這與「Just True」和「Just False」的含義有什麼不同? – dave4420

回答

8
data Structured = Structured Int String Int [Int] 

會工作。

confirm :: (Structured -> Bool) -> Structured -> Bool 

似乎是一種更明智的類型,但有一個簡單的實現爲id

我不認爲你需要從VALUEATION函數返回Maybe Bool - Maybe a適用於當你通常重新生成a,但有時不需要。 (這對於非常簡單的錯誤處理很有用,例如 - 如果出現錯誤,請給出Nothing)。在這種情況下,您總是可以得出結論,確定您的輸入是否有效,因此您總是可以給出TrueFalse - 否需要Maybe

也許你可以有類似

confirm :: (String -> Bool) -> (Int -> Bool) -> Structured -> Bool 
confirm okString okInt (Structured int1 string int2 ints) = 
     all okInt (int1:int2:ints) && okString string 

這裏int1:int2:ints是,在intsint2前面有int1列表。

結構定義一個稍微更好的辦法是:

data Structured = Structured { 
      length ::Int, 
      name ::String, 
      width ::Int, 
      somenumbers :: [Int]} 

,那麼你就必須

confirm :: (String -> Bool) -> (Int -> Bool) -> Structured -> Bool 
confirm okString okInt s = 
     all okInt (length s:width s:somenumbers s) && okString (name s) 

它做相同的工作作爲第一個數據聲明,但給你功能,讓在內部。