0

我想创建一个名为Structured的结构数据类型,可用于表示String、IntList。例如,结构类似于:[ Int , String , Int ,[ Int ]]。

问题1:如何创建这个数据类型?

data Structured = ...

问题2:一个叫做Confirm的函数,它确认输入满足一个限制,并且签名类型为confirm:: Restriction -> Structure ->Maybe Bool

4

1 回答 1

8
data Structured = Structured Int String Int [Int]

会工作。

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

似乎是一个更明智的类型,但有一个微不足道的实现,如id.

我认为您不需要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:intsint1前面int2的列表ints

定义结构化的稍微好一点的方法是:

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)

它与第一个数据声明的工作相同,但为您提供了获取内部信息的功能。

于 2012-10-22T11:17:11.063 回答