2014-09-29 118 views
8

有一個默認的單元類型,即()。我正在尋找一個多態的一個(最好是在Hackage),例如:Haskell中是否有默認的多態單元類型haskell

data PUT a = PUT 

或者一個多態零類型:

data PZT a = PZT (PZT a) 

所以,是的,我可以寫一個自己,通過任一以上陳述。我正在尋找一個黑客。

我需要它,是因爲我有多個類型參數的類,它包含一個不使用其中的一個功能:使用此功能「someFunction」當

class MyClass a b where 
    someFunction :: a 
    -- and some other functions 

,GHC不能找到合適的情況下,所以我改變了我的定義是:

class MyClass a b where 
    someFunction :: (PUT b) -> a 

現在,當我打電話someFunction,我可以使用(PUT :: SOMETYPE)作爲第一個參數,和Haskell可以得到我的意思是這實例。每次我使用這個技巧時,我都會編寫一個新的多態單元類型(它只是一行代碼),在組合不同的庫時會給我一些額外的工作(因爲我最好在各處使用相同的構造函數)。 我確定其他人遇到這個問題,所以也許他們中的一個把解決方案放在hackage(ghc的包管理器)中?我想導入它。我是在尋找錯誤的東西,還是不存在黑客行爲?

+1

我很困惑「多態零型」的含義。我本可以預料它是一種無人居住的類型,除了未定義類型之外,就像Void一樣。但是我可以通過'let p = PZT p'構造一個你的PZT類型的值,並且可以成功地進行模式匹配,所以無論我誤解PZT的含義,還是你的PZT都不是一個。當然,你可以更簡單地構建一個多態Void:'數據避免一個'無人居住。 – amalloy 2014-09-29 18:49:23

+0

確定你不需要funDep在那裏?幫助推斷MPTC。 – 2014-10-09 14:21:11

+1

事實證明,你並不需要這種類型。下面也有效: 'class MyClass ab where someFunction ::(fb) - > a' 請注意,由於沒有關於f的信息(它不適用於任何應用程序或任何東西),這意味着沒有辦法到達b,這正是我所需要的。 – Sebastiaan 2015-03-07 15:18:09

回答

20

我認爲你在找什麼通常叫Proxy。由於基極 - 4.7,它是在Data.Proxy

類似的事情,這是可以在基體由於除了Proxy不再可用,是Const,例如你可以使用Const()

+6

還要注意表達'someFunction'類型的常見方式,不是'Proxy b - > a',而是'proxy b - > a'(注意大寫),以免本身需要'Proxy'。 – 2014-09-29 19:57:15