[英]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
。 即使用戶要求,它也不會返回Int
或Double
。
使代碼工作的一種方法是使用多參數類型類來定義具有兩個參數的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.