我遇到問題。我有一個數據類型,這本質上是Maybe Doubles或Maybe Texts的大記錄。我想創建一個數據類型,它可以捕獲在其上運行計算的想法,即使某些字段可能爲Nothing。Haskell:適用於元組
data Computation a b = Computation
{ getInputs :: Thing -> a
computation :: a -> b
modifyThing :: b -> Thing -> Thing
}
基於輸出B,將最有可能對應於某些事情領域,我想創建一個新的東西。
modifyThing :: b -> Thing -> Thing
從事物的計算來也許B可以被分成兩個部分,裝載變量和剛剛接受數字或文字的計算。
getInputs :: Thing -> a
computation :: a -> b
以上幾乎是我想要的。在這種情況下,a會是(也許a1,也許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
如果有任何可能的是沒有那麼就返回Nothing。我能做
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的方法是把它寫成答案,而不是將其包含在對問題的編輯中。我鼓勵你將你的「編輯」分成它自己的實體 - 如果它是你得到的最好答案,甚至接受它。 (這在這裏被認爲是完全有禮貌的,甚至是可取的。) –