我開始用GHC 7.4.2中的新類約束擴展來弄溼我的腳,但是我有一些問題需要一個小例子來工作。代碼如下:haskell約束系列
{-# LANGUAGE UndecidableInstances,
MultiParamTypeClasses,
KindSignatures,
TypeFamilies,
Rank2Types,
ConstraintKinds,
FlexibleInstances,
OverlappingInstances #-}
module Test where
import GHC.Exts -- to get Constraint type constructor
class NextClass f where
type Ctxt f a :: Constraint
next :: (Ctxt f a) => a -> a
instance NextClass Int where
type Ctxt Int a = Num a
next b = b + 1
n :: (NextClass a) => a -> a
n v = next v
我想要做的就是定義一個NextClass
類型的類,這將讓我(給定值x)得到X的下一個值是的情況下,所有類型是什麼NextClass
。要使用+
運算符,我需要Num a
類約束Int
。
然而,GHC給了我以下錯誤:
Could not deduce (Ctxt f0 a) arising from a use of `next'
from the context (NextClass a)
bound by the type signature for n :: NextClass a => a -> a
In the expression: next v
In an equation for `n': n v = next v
我懷疑GHC告訴我,它沒有足夠的信息來確定要使用的約束族實例。
有人可以解釋我在做什麼錯在這裏。這是限制家庭的正確使用嗎?
TIA
感謝丹尼爾,我改變了我的代碼使用'實例Num Int => NextClass Int其中...'。這是在Haskell中編寫這種類型代碼的慣用方法嗎? –
@RananvanDalen那麼,慣用的方法是'實例NextClass Int其中...'沒有無約束的約束或'newtype SuccNext a = SuccNext a;實例Num a => NextClass(SuccNext a)其中...具有多態類型(以及防止虛假重疊的新類型)。 –
好東西。我必須再讀一遍類型類:) –