在Haskell中,如何重載內置函數,如!!
?Haskell中內置函數的過載
我最初試圖弄清楚如何重載內置函數!!
以支持自己的數據類型。具體來說,!!
的類型爲:
[a] -> Int -> a
,我想保留它現有的功能,還能夠在那裏它的類型簽名看起來更像
MyType1 -> MyType2 -> MyType3
我本來想做叫它這是因爲MyType1就像一個列表,我想使用!!
運算符,因爲我的操作與從列表中選擇項目非常相似。
如果我重載了像+
之類的東西,我可以將我的函數的一個實例添加到適用的類型類,但我不認爲這是一個選項。
我不確定我實際上甚至想重載這個函數,但我仍然對如何完成它感興趣。其實,如果超載運營商如!!
甚至是一個好主意的意見,也將不勝感激。
這是通過讓用戶導入兩個不同的'(!!)'並且至少有一個合格的,或者通過使用'(!)'來查找/索引來解決的。你不能真正重載Haskell中的任意函數/運算符。 – kqr
請注意,您在技術上不能「超載」'!!',如果超載,則表示臨時的基於非類型類型的多態性。您可以像「超載」fmap,「<$>」或「>> =」那樣「重載」它,但它們必須被限制爲明確的類型類型(如monad或applicative或「list-like」)他們的類型簽名被推廣到整個類型類。你最好的選擇是爲類型類定義你自己的新的,泛化的'(!!)'的類型簽名,並且爲你想要的所有東西(!!)'定義實例。 –