определены простые типы и сложный тип структура , для них следовало реализовать следующие функции ... в частности с последней у меня возникла проблема :
5. getByTypes, аналогичная предыдущей, но принимающей вместо одного типа списков типов (с помощью этой функции можно получить, например, список всех идентификаторов с числовым типом).
при вводе getByTypes [MyInt, MyString] base
выдает ["first","next","str"] , но если в качестве аргумента задать MyStruct , то выдает ошибку , как сделать так чтоб функция работала с этим типом ?
data MyType = Null |
MyInt |
MyDouble |
MyString |
MyStruct [(String,MyType)] deriving (Show,Eq)
isStructured :: MyType -> Bool
isStructured (MyStruct a) = True
isStructured (_) = False
getType :: String -> [(String, MyType)] -> MyType
getType _ [] = Null
getType s (h:t) | fst(h) == s = snd(h)
| otherwise = getType s t
getFieldsFromStruct :: MyType -> [(String,MyType)]
getFieldsFromStruct (MyStruct a) = a
getFieldsFromStruct _ = []
getFields :: String -> [(String,MyType)] -> [(String,MyType)]
getFields _ [] = []
getFields s (h:t) | fst(h) == s && isStructured (snd h) = getFieldsFromStruct (snd h)
| otherwise = getFields s t
getByType :: MyType -> [(String,MyType)] -> [String]
getByType _ [] = []
getByType a (h:t) | a == (snd h) = (fst h) : getByType a t
| otherwise = getByType a t
getByTypes :: [MyType] -> [(String,MyType)] -> [String]
getByTypes _ [] = []
getByTypes [] _ = []
getByTypes (h:t) a = (getByType h a) ++ getByTypes t a
base = [("first",MyInt), ("second",MyDouble), ("str",MyString), ("next",MyInt) ,("s",MyStruct[("s1",MyInt),("s2",MyDouble)])]