2016-09-24 43 views
0

假設我有某種類型的,如:刪除幻象型可變

newtype Foo a b = Foo { getFoo :: SomeStructure b } 

a是僅用於編譯時檢查的幻像類型。

但是,我不想在任何地方使用幻像類型。這在我的代碼中並不普遍。所以我想做類似的事情:

type FooUnrestricted b = Foo Anything b 

我應該用什麼來代替Anything?我需要一些語言擴展嗎?

編輯:我意識到我可以簡單地使用()它會回答我的問題。但實際問題是我有一些功能限制了a,我希望他們始終滿意。

+0

也許你可以使用'coerce'? – Rufflewind

回答

3

一種選擇是使用一個存在類型:

data UnrestrictedFoo b where 
    Unrestricted :: Foo a b -> UnrestrictedFoo b 

在一些其他情況下,它可能是有意義的使用等級2類型來代替。

newtype UnrestrictedFoo b = UnrestrictedFoo (forall a . Foo a b) 
1

您可能在類型級別尋找undefined來爲類型創建存根。這已經在這裏討論了: Undefined at the type level

所以你可以定義你自己的數據類型併爲你使用的任何類型類創建實例。如果您希望降低需要實施的實例數量,則可以使用一些標準數據類型,例如Void甚至Proxy()。後者更好,因爲它有更多的實例。

http://hackage.haskell.org/package/base-4.9.0.0/docs/Data-Void.html

http://hackage.haskell.org/package/base-4.9.0.0/docs/Data-Proxy.html

1

我同意()是在這裏使用的最佳類型,因爲它傳達的是你不關心類型,但如果你希望它滿足你的代碼的限制,你可以newtype,並推導出當你需要它們時,需要的實例變得輕而易舉。