2016-10-29 4 views
3

У меня возникли проблемы с этим кодом. Я пытаюсь написать простую функцию, которая принимает два списка и пытается разделить каждый элемент списка A на соответствующий элемент списка B. Если элемент в списке B равен 0, он должен вернуть Nothing, в противном случае он должен вернуть Just (a/b).Haskell code zipWith using Возможно

Вот код:

divlist :: Integral a => [a] -> [a] -> [Maybe a] 
divlist = zipWith (\x y -> if (y /= 0) then Just (x/y) else Nothing) 

Это, вероятно, что-то глупо, но я просто не могу найти его.

EDIT: Это то, что GHCi сообщает:

C:\Users\spravce\Desktop\Haskell\6.hs:16:51: error: 
    • Could not deduce (Fractional a) arising from a use of ‘/’ 
    from the context: Integral a 
     bound by the type signature for: 
       divlist :: Integral a => [a] -> [a] -> [Maybe a] 
     at C:\Users\spravce\Desktop\Haskell\6.hs:14:1-48 
    Possible fix: 
     add (Fractional a) to the context of 
     the type signature for: 
      divlist :: Integral a => [a] -> [a] -> [Maybe a] 
    • In the first argument of ‘Just’, namely ‘(x/y)’ 
    In the expression: Just (x/y) 
    In the expression: if (y /= 0) then Just (x/y) else Nothing 
Failed, modules loaded: none. 

EDIT 2: Использование div x y вместо x/y просто сделал это. :) Благодаря.

ответ

7

Вы указываете ограничение Integral на свою функцию, но используя (/) внутри функции, которая обозначает дробное деление.

Возможно, вы захотите использовать div, который является интегральным делением, например. 3 `div` 2 == 1. В противном случае измените ограничение с Integral на Fractional (это то, что сообщается вам об ошибке).