簡體   English   中英

Haskell無法創建TypeClass的實例

[英]Haskell Unable to create instance of a TypeClass

我是Haskell的新手,並且正在嘗試使用實例創建一個類。

我有以下代碼,我試圖說:1)分支可以在其第一個位置保持任何類型,2)創建一個類線性,它取線性的東西,並返回一個數字3)使分支成為線性的實例,如果分支持有的第一件事是Num類的一部分。

data Branch a = Branch a Integer deriving (Show, Eq)

class Linear l where
    length :: (Num a) => l -> a

instance (Num a) => Linear (Branch a) where
    length (Branch len _) = len

我得到錯誤:無法推斷(a~a1)來自實例聲明綁定的上下文(Num a).....

有誰知道如何在Haskell中表達我想說的是什么?

您的類定義表示該length必須能夠返回用戶請求的任何Num類型。 因此,如果用戶想要一個Integer,那么length方法必須給他一個Integer。 如果他想要一個Int或一個Double,長度也必須給他那個。

但是,您在實例聲明中提供的長度函數不符合要求。 例如,當您在Branch Integer上調用length時,length將返回Integer 即使用戶要求,它也不會返回IntDouble

使代碼工作的一種方法是使用多參數類型類來定義具有兩個參數的Linear,其中第二個類型是應該返回的數字類型length 然后,您可以擁有Linear (Branch a) a的實例。 您可能還希望使用Functional Dependencies擴展來使其更加可用。 您也可以使用Type Families擴展來實現類似的效果,而不是第二個類型參數。

另一種方法是將實例聲明更改為需要Integral a而不是Num a ,然后使用fromIntegral len作為返回值。 這會將存儲在分支中的整數類型轉換為用戶請求的任何數字類型。 當然,需要注意的是,您使用非整數數值進行分支,這樣就不會是Linear實例。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM