Ich habe ein Problem. Ich habe einen Datentyp Thing, der im Wesentlichen eine große Aufzeichnung von Maybe Doubles oder Maybe Texts ist. Ich möchte einen Datentyp erstellen, der die Idee der Ausführung von Berechnungen erfassen kann, obwohl einige Felder nichts sein können.Haskell: Applicative über Tupel
data Computation a b = Computation
{ getInputs :: Thing -> a
computation :: a -> b
modifyThing :: b -> Thing -> Thing
}
Basierend auf dem Ausgang b, die am ehesten zu einem Feld in der Sache entsprechen werden, möchte ich eine neue Sache zu schaffen.
modifyThing :: b -> Thing -> Thing
Die Berechnung von Thing Vielleicht in zwei Teile aufgeteilt werden, b können die Variablen und eine Berechnung laden, die nur Zahlen oder Texte akzeptiert.
getInputs :: Thing -> a
computation :: a -> b
Das obige ist fast das, was ich will. In diesem Fall wäre a (vielleicht a1, vielleicht a2 ..) und so weiter. Dies bedeutet, dass in „Berechnung“ und getInputs ich so etwas wie
getInputs t = \t -> (getProp1 t , getProp2 t)
computation = \(m_a1, m_a2) -> do
a1 <- m_a1
a2 <- m_a2
return $ a1 + a2
zu tun haben, würde ich viel eher wie
suchen haben Rechen- und dann wie etwas tun
runComputation :: Thing -> Computation -> b
runComputation thing comp = magic (computation comp) ((getInputs comp) thing)
where magic = ???
Das Problem ist, dass ich nicht weiß, wie man von
gehtzu
a1 -> a2 -> ... -> a_n
Wenn eine der vielleicht ist nichts anderes als nur nichts zurück. Ich kann
pure computation <*> m_a1 <*> m_a2 <*> m_a3
aber wie kann ich schreiben, um für jede Art von Tupel zu arbeiten?
P.S.
Ich dachte über die Berechnung als
computation :: Thing -> b
schreiben und tun weg mit getInputs, aber es scheint, wäre es viel unweildy für mich mit zu testen und zu spielen. Deshalb versuche ich, mit dem oben beschriebenen Ansatz zu gehen. Denkst du, dass das eine gute Idee ist, was ich getan habe?
bearbeitet
Während keine Lösung für die jeweilige Frage, die ich gefragt, sondern auf die Absicht von dem, was ich tun wollte, ich, dass
data Computation = Computation
{ getInputs :: Thing -> Maybe a
, computation :: a -> b
, modifyThing :: b -> Thing -> Thing
}
tun beschlossen
der beste Weg wäre, vorwärts gehen. Auf diese Weise muss ich mich nicht um die Tupel kümmern.
Gibt es einen Grund, warum Sie nicht eine Liste von vielleicht ist nicht verwenden kann? – Guvante
@ Guvante Ein Nachteil von Listen ist, dass sie homogen sind - z. man wäre nicht in der Lage, gleichzeitig ein "Double" -y typisiertes Feld und ein "Int" -y typisiertes Feld auszuwählen. –
@ user3550758 Wenn Sie eine Lösung finden, ist der StackOverflow-Weg, um es als Antwort zu schreiben, nicht in eine Bearbeitung der Frage enthalten. Ich ermutige Sie, Ihre "Bearbeitung" in eine eigene Einheit aufzuteilen - und akzeptieren Sie sie sogar, wenn es die beste Antwort ist, die Sie erhalten. (Dies wird hier als vollkommen höflich und sogar wünschenswert angesehen.) –