Я использую модуль Data.Data для динамического захвата некоторых данных типа данных во время выполнения. Давайте предположим, что есть тип данных, как data Place = Place {name :: Text, description :: Text} deriving (Data)
:Динамически извлекать значения типа данных
- я мог восстановить его конструктор с toConstr
toConstr (Place "Some place" "Bla")
который даст мнеPlace
- Я мог бы получить его метку поля с constrFields
constrFields $ toConstr (Place "Some place" "Bla")
, который даст мне["name", "description"]
Теперь мне нужно получить значения, с помощью которых я построил Place, поэтому для Place "Some place" "Bla"
Я хочу извлечь что-то вроде ["Some place", "Bla"]
, поймать то, что в моей треске e Я не знаю, что это значение данных является Place
, это может быть любой тип данных, который выводит класс Data
. Код Icn:
getValuesOfDataValue :: (Data a) => a -> [String]
getValuesOfDataValue a =
-- some magic generic function
data Place = Place {name :: Text, description :: Text} deriving (Data)
-- the code below should evaluate to ["Some place", "Bla"]
getValuesOfDataValue (Place "Some place" "Bla")
data SomeType = SomeType {num :: Integer, num2 :: Integer} deriving (Data)
-- the code below should evaluate to [300, 500]
getValuesOfDataValue (SomeType 300 500)
Как это сделать?
Примечание: getValuesOfDataValue
не должен возвращать ровно тип [String], он просто должен иметь значения, упакованные в что-то.
Просьба предоставить более/лучший код. Топ-уровень 'let' не является законным Haskell, и неясно, что должен делать 'constrFields'. Это также помогло бы нам обоим, если бы вы дали типы для 'p',' c' и т. Д. – crockeea
Взгляните на 'gfoldl'. – PyRulez
Пожалуйста, добавьте действительный код Haskell, который описывает проблему, с которой вы сталкиваетесь. –