2014-07-01 3 views
0

У меня есть код:Как исправить эту ошибку в моем Haskell код:

module Task5 where 

import Prelude 

data Stream a = a :& Stream a 

infixl 4 :& 

add :: Num a => a -> a -> a 
add a b = a + b 

instance Num a => Num (Stream a) where 
    (+) (ia:&a) (ib :& b) = (ia + ib) :& ((+) a b) 

    (-) (ia :& a) (ib :& b) = ((-) ia ib) :& (-) a b 
    (*) (ia :& a) (ib :& b) = ((*) ia ib) :& (*) a b 
    negate (i1 :& a) = negate i1 :& negate a 
    abs (i1 :& a) = abs i1 :& abs a 
    signum (i1 :& a) = signum i1 :& signum a 
    fromInteger (i1 :& a) = fromInteger i1 :& fromInteger a 

и есть 2 ошибки:

Task5.hs:20:18: 
    Couldn't match expected type `Integer' 
       with actual type `Stream Integer' 
    In the pattern: i1 :& a 
    In an equation for `fromInteger': 
     fromInteger (i1 :& a) = fromInteger i1 :& fromInteger a 
    In the instance declaration for `Num (Stream a)' 

Task5.hs:20:59: 
    Couldn't match expected type `Integer' 
       with actual type `Stream Integer' 
    In the first argument of `fromInteger', namely `a' 
    In the second argument of `(:&)', namely `fromInteger a' 
    In the expression: fromInteger i1 :& fromInteger a 
Failed, modules loaded: none. 

Я не понимаю, как исправить эту проблему, так как правильно эта проблема?)) А что вы можете посоветовать мне прочитать для изучения haskell?

+1

fromInteger имеет тип Integer -> a, поэтому аргумент к нему должен быть целым числом, а не потоком. Он предназначен для преобразования целого числа в ваш экземпляр num. –

+5

* «И что вы можете посоветовать мне прочитать для изучения haskell?» * [RWH] (http://book.realworldhaskell.org/read/), [LYAH] (http://learnyouahaskell.com/chapters), [wikibook] (https://en.wikibooks.org/wiki/Haskell), но самое главное: __проводить подписи функций, которые вы используете, когда вы сталкиваетесь с ошибками. – Zeta

ответ

3

Тип fromInteger является

Num a => Integer -> a 

поэтому для преобразования Integer в ваш Num типа. Таким образом, первый аргумент fromInteger должен быть Integer, однако в своей реализации:

fromInteger (i1 :& a) = fromInteger i1 :& fromInteger a 

это Stream.

Одна из возможных реализаций заключается в создании бесконечного потока преобразованных целых значений, например.

fromInteger i = (fromInteger i) :& (fromInteger i) 
+0

Да, но как я могу исправить? – gyok

+0

@gyok Что вы хотите, чтобы ваш метод 'fromInteger'? Похоже, вы хотите, чтобы он взял поток и выполнил операцию «fromInteger» базового типа num для каждого из своих элементов. Как сказал Ли, вы не можете этого сделать, потому что 'fromInteger' принимает Integer. Таким образом, вы «исправляете» это, делая 'fromInteger' делать что-то еще - что-то, что фактически работает на Integer. – sepp2k

+0

Да, anderstand, но я хочу, если поток имеет целые элементы вроде (5 &: 6 &: 7 ...) frominteger работает с ним – gyok

Смежные вопросы