2017-02-08 32 views
0

我曾經見過你這樣定義的元組類型的例子:錯誤元組:在約束非類型變量參數:積分(A,A)

countRepetitions :: (Integral a, Integral (a,a)) => [a] -> a -> (a,a) 

但是,當我執行出現的代碼消息: 約束中的非類型變量參數:Integral (a, a) 如何聲明元組類型?

+0

你是什麼意思「聲明一個元組類型」?其實它是很奇怪的,因爲一個元組並不是真正的整數:它很難將其轉換爲一個不錯的「Integer」... –

+0

這[不難](https://en.wikipedia.org/wiki/Integer #建設),但在這裏並不特別有用。 – chepner

回答

1

您無需限制Integral (a, a)。約束Integral a強制類型a的所有值爲Integral。嘗試像這樣重寫它:

countRepetitions :: Integral a => [a] -> a -> (a,a) 
+0

如果元組的第二個元素是任何類型,該怎麼辦? – Marcio

+0

如果您希望參數爲任何類型,請使用不受約束的泛型參數。例如,這使得函數的第二個參數不受約束:'countRepetitions :: Integral a => [a] - > b - >(a,a)'。但是,返回一種類型的「(a,b)」,在那裏你返回一個完全未知的東西作爲第二個參數,可能並不是你想要的。 –

+0

非常感謝你! – Marcio

相關問題