我似乎已經陷入了這裏一種有趣的語言邊緣情況。這是棘手解釋什麼,我試圖做的,所以讓我把它寫在代碼來代替:Coerce幻影類型
data Foobar x =
Foo1 {field1 :: x, field2 :: String} |
Foo2 {field1 :: x, field3 :: Int} |
Foo3 { field4 :: Bool} |
Foo4 { field2 :: String, field4 :: Bool}
正如你所看到的,一些構造取決於x
,但別人不一樣。我想類似的功能寫入fmap
:
transform :: (x -> y) -> Foobar x -> Foobar y
transform fn foobar =
case foobar of
Foo1 {} -> foobar {field1 = fn (field1 foobar)}
Foo2 {} -> foobar {field1 = fn (field1 foobar)}
_ -> foobar
正如你所看到的,記錄語法巧妙地讓我避免重建整個構造,應用fn
只在需要的地方。不幸的是,當fn
需要在零的地方。在這種情況下(即最後的選擇),該表達式不能進行類型檢查。我很清楚爲什麼它失敗 - 但我很困惑,至於如何修復這個。
很顯然我可以長時間寫出整件事情。這對於這個簡化的例子來說很有效,但是我想寫的真正的應用程序要大得多。 (大約25名建設者,其中一些具有15個以上的領域)。
有沒有人有任何關於如何解決這個問題的簡潔想法?
你可以添加'派生Functor'並讓編譯器爲你編寫所有的25個案例嗎? –
@DanielWagner真正的類型有多個類型參數 - 我打算爲每個參數寫一個'transform'函數。我不知道有什麼辦法可以推導出來。 – MathematicalOrchid
[這個問題](http://stackoverflow.com/q/4069840/485115)可能是你感興趣的。 –