DennisKingsman
@DennisKingsman
Студент

Как можно доработать функцию для собственного типа?

определены простые типы и сложный тип структура , для них следовало реализовать следующие функции ... в частности с последней у меня возникла проблема :
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)])]
  • Вопрос задан
  • 54 просмотра
Решения вопроса 1
youngmysteriouslight
@youngmysteriouslight
ТК, ТТ, JS, FP, WM
при вводе getByTypes [MyInt, MyString] base выдает ["first","next","str"]
Значит, функция работает.

если в качестве аргумента задать MyStruct , то выдает ошибку , как сделать так чтоб функция работала с этим типом ?
Как происходит вызов?
getByTypes [MyStruct[("s1",MyInt),("s2",MyDouble)]] base
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы