У меня проблема. У меня есть тип данных Thing, который по сути является большой записью «Возможно, парные» или «Возможно, тексты». Я хочу создать тип данных, который может захватить идею выполнения вычислений на нем, хотя некоторые поля могут быть Nothing.Haskell: Применимо для кортежей
data Computation a b = Computation
{ getInputs :: Thing -> a
computation :: a -> b
modifyThing :: b -> Thing -> Thing
}
Основываясь на выходе Ъ, что, скорее всего, соответствует некоторому полю в Thing, я хочу, чтобы создать новую вещь.
modifyThing :: b -> Thing -> Thing
Вычисление от Thing к Может б можно разделить на две части, загрузка переменных и вычисление, которое просто принимает номера или тексты.
getInputs :: Thing -> a
computation :: a -> b
Вышеуказанное почти то, что я хочу. В этом случае a будет (возможно, a1, Maybe a2 ..) и так далее. Это означает, что в «вычисления» и getInputs я должен сделать что-то вроде
getInputs t = \t -> (getProp1 t , getProp2 t)
computation = \(m_a1, m_a2) -> do
a1 <- m_a1
a2 <- m_a2
return $ a1 + a2
Я предпочел бы иметь вычисление просто смотреть, как
, а затем сделать что-то вроде
runComputation :: Thing -> Computation -> b
runComputation thing comp = magic (computation comp) ((getInputs comp) thing)
where magic = ???
Проблема в том, что я не знаю, как это сделать, начиная с
(Maybe a1, Maybe a2, ... , Maybe a_n)
в
a1 -> a2 -> ... -> a_n
Если какой-либо из Maybe являются не то просто не возвращают ничего. Я могу сделать
pure computation <*> m_a1 <*> m_a2 <*> m_a3
но как я могу написать магию для работы с любым типом кортежа?
P.S.
Я думал о написании вычисления, как
computation :: Thing -> b
и покончив с getInputs, но мне кажется, было бы гораздо более unweildy для меня, чтобы проверить и играть. Вот почему я пытаюсь использовать подход, описанный выше. Считаете ли вы, что это хорошая идея, что я сделал?
отредактировал
Хотя не решение конкретного вопроса, я спросил, но с намерением, что я пытался сделать, я решил, что делать
data Computation = Computation
{ getInputs :: Thing -> Maybe a
, computation :: a -> b
, modifyThing :: b -> Thing -> Thing
}
будет лучшим способом идти вперед. Таким образом, мне не нужно беспокоиться о кортежах.
Есть ли какой-либо причине вы не можете использовать список, может быть, это? – Guvante
@ Guvante Один из недостатков списков состоит в том, что они являются однородными - например, невозможно было бы выбрать одновременно поле «Double»-y и поле ввода «Int'-y». –
@ user3550758 Если вы найдете решение, способ StackOverflow должен записать его в качестве ответа, а не включать его в редактирование вопроса. Я призываю вас разделить свое «редактирование» на свою собственную сущность и даже принять его, если это лучший ответ. (Это считается совершенно вежливым и даже желательно здесь.) –