2012-05-22 68 views
2

Haskell是否可以將函數的箭頭類型構造函數( - >)僅應用於其右側類型(例如:( - > a))以獲取類型* - > *的類型構造函數?Haskell將函數箭頭應用於僅結果類型?

+4

使用'newtype' – is7s

+0

是的,我寧願避免這種情況,因爲這將讓事情變得更復雜。我幾乎肯定我已經看到它完成了。 – Edward

+0

原來,是的,我確實需要一種新類型。如果您將該帖子作爲答案發布,我會接受它,以便您可以獲得讚譽。 – Edward

回答

3

不,目前不可能。 Haskell的類型系統有一定的侷限性,可以在大多數情況下對Haskell類型系統有用且方便,這就是其中一個限制。你最好的選擇是使用新類型。

newtype FuncFlip r a = FuncFlip { unFuncFlip :: a -> r } 

Newtypes只是標籤,以幫助編譯器知道如何正確地進行類型檢查和執行型導向訊(類型類)。大概你想翻轉類型參數來提供一些類型實例。這意味着只要你想使用該類型類的函數,就必須用FuncFlip來修飾任何特定的輸入,並用unFuncFlip對任何特定的輸出進行去除。這比所希望的稍微冗長一些,但實際上並不是那麼糟糕,因爲它迫使你明確地確定你想要使用哪個類型類的實例。

您可以爲此創建一個Newtype的實例,這可能會或可能不會對您很方便。

instance Newtype (FuncFlip r a) (a -> r) where 
    pack = FuncFlip 
    unpack = unFuncFlip 

延伸閱讀:Are there "type-level combinatos?"