我想创建一个名为Structured的结构数据类型,可用于表示String、Int和List。例如,结构类似于:[ Int , String , Int ,[ Int ]]。
问题1:如何创建这个数据类型?
data Structured = ...
问题2:一个叫做Confirm的函数,它确认输入满足一个限制,并且签名类型为confirm:: Restriction -> Structure ->Maybe Bool
我想创建一个名为Structured的结构数据类型,可用于表示String、Int和List。例如,结构类似于:[ Int , String , Int ,[ Int ]]。
问题1:如何创建这个数据类型?
data Structured = ...
问题2:一个叫做Confirm的函数,它确认输入满足一个限制,并且签名类型为confirm:: Restriction -> Structure ->Maybe Bool
data Structured = Structured Int String Int [Int]
会工作。
confirm :: (Structured -> Bool) -> Structured -> Bool
似乎是一个更明智的类型,但有一个微不足道的实现,如id
.
我认为您不需要Maybe Bool
从评估函数中返回 -Maybe a
当您通常返回时很有用a
,但有时不需要。(这对于非常简单的错误处理很有用,例如 -Nothing
如果有错误,请给出。)在这种情况下,您始终可以得出关于您的输入是否有效的结论,因此您可以随时回馈True
或False
- 不需要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
是int1
前面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)
它与第一个数据声明的工作相同,但为您提供了获取内部信息的功能。