2016-04-12 25 views
-1

Aşağıdaki işlevi çalıştırmaya çalıştığımda hata alıyorum.Haskell: liste anlama: Kısıtlamada non-type değişkenli argüman: Num [t]

Prelude> let squareSum list = [result | (x, y, z) <- list, result <- x^2 + y^2 + z^2] 

<interactive>:4:5: 
    Non type-variable argument in the constraint: Num [t] 
    (Use FlexibleContexts to permit this) 
    When checking that ‘squareSum’ has the inferred type 
    squareSum :: forall t. Num [t] => [([t], [t], [t])] -> [t] 

Birisi bana anlatabilir, Nasıl düzeltebilirim? Bu hata tam olarak ne aktarıyor?

+2

muhtemelen bir * toplamından * sonuç çıkarmayı denediğiniz için * sanırım * sanırım istediğiniz kare kare listesine = [x^2 + y^2 + z^2 | (x, y, z) <- liste] '? – Carsten

+0

Teşekkürler Carsten. Denedim ama yine de aynı sorunla karşı karşıya kaldım. Prelude> let squareSum list = [x^2 + y^2 + z^2 | (X, y, z) <- listesi] Prelüd> squareSum [1, 2, 3] : 33: 1: kısıtlaması olmayan tip değişken bağımsız değişken: Num (t, t, t) (Bu izin vermek için FlexibleContexts kullanın) Bu 'it' denetleniyorsa, türetilmiş tür it :: forall t. (Num t, Num (t, t, t)) => [t] –

+0

Çünkü onu ilk başta tuple ile tanımladığınız şekil olarak adlandırmanız gerekir. [(1,2,3), (4 , 5,6)] ' – Carsten

cevap

5

Orijinal Soru

Sen yayınlanmıştır:

Prelude> let squareSum list = [result | (x, y, z) <- list, result <- x^2 + y^2 + z^2] 

<interactive>:3:5: 
    Non type-variable argument in the constraint: Num [t] 
    (Use FlexibleContexts to permit this) 
    When checking that ‘squareSum’ has the inferred type 
     squareSum :: forall t. Num [t] => [([t], [t], [t])] -> [t] 

Bunun nedeni değerlerin kaynağı olarak kullanmanın, bir liste olmalı hesaplama x^2 + y^2 + z^2 olan çıkarsama geliyor liste anlama (result <- ...). Ve eğer bu bir liste ise, o zaman matematiksel işleçler liste üzerinden yazılan değerdir, yani başlangıç ​​değişkenleriniz, list listesinin bir liste listesi olmalıdır ([([t],[t],[t])]) ve her liste bir şekilde geçerli sayılar olmalıdır (Num [t]).

Comment Soru

Prelude> let squareSum list = [ x^2 + y^2 + z^2 | (x, y, z) <- list] 
Prelude> squareSum [1,2,3] 

<interactive>:9:1: 
    Non type-variable argument in the constraint: Num (t, t, t) 
    (Use FlexibleContexts to permit this) 
    When checking that ‘it’ has the inferred type 
     it :: forall t. (Num t, Num (t, t, t)) => [t] 

Şimdi değişken list dizilerini ((x, y, z) <- list) içeriyor ama o zaman [1,2,3] olarak liste tanımlamak söylüyorlar. Her ikisini de tatmin etmek için 1, 2 ve ve 3 sayısal hazırlıkları, bir sınıf örneğini Num (t, t, t) tanımladıysanız mümkün olan tuplleri temsil etmelidir.

Sen

Ne İster Carter zaten size çözüm demiştim, ama mantıklı bir listeye geçerli değildi. Bir çözümü tanımlayıp, açık bir tip vermemize ne dersiniz, daha az karışıklık var!

Prelude> :{ 
Prelude| let squareSum :: [(Int,Int,Int)] -> [Int] 
Prelude|  squareSum list = [ x^2 + y^2 + z^2 | (x, y, z) <- list] 
Prelude| :} 
Prelude> squareSum [(1,2,3), (4,5,6)] 
[14,77] 

Başarı! İki tuple sağladık ve iki Int sonuç elde ettik, yay!

-1

Aşağıdaki pasaj sorunumu çözdü.

Prelude> let processData fun list = [y | x <- list, let y = fun x] 
Prelude> let sumSquare (x, y, z) = x^2 + y^2 + z^2 
Prelude> 
Prelude> processData sumSquare [(1, 2, 3), (4, 5, 6)] 
[14,77]