2016-02-19 1 views
0

У меня есть файл вс, пытаясь перегрузить & & оператораПерегрузка глобального && оператора в Haskell не удается скомпилировать

(&&)::Bool->Bool->Bool 
True && x = x 
False && _ = False 

and' :: (Bool)->Bool 
and' xs=foldr (&&) True xs 

При импорте в Prelude, есть ошибка:

Ambiguous occurrence ‘&&’ 
It could refer to either ‘Main.&&’, defined at D:\baby.hs:2:6 
         or ‘Prelude.&&’, 
         imported from ‘Prelude’ at D:\baby.hs:1:1 
         (and originally defined in ‘GHC.Classes’) 

Я изменил последнюю строку на

and' xs=foldr (Main.&&) True xs 

Теперь он печатает новый номер ror:

Couldn't match expected type ‘t0 Bool’ with actual type ‘Bool’ 
In the third argument of ‘foldr’, namely ‘xs’ 
In the expression: foldr (Main.&&) True xs 

Как решить эту проблему? Благодарю.

+4

Тип 'xs' должен быть' [Bool] ', но не' (Bool) '. – zakyggaps

ответ

3

В Haskell нет перегрузок. Идентификаторы могут использоваться совместно с классами, но && не является членом класса и, следовательно, не может использоваться совместно. Когда вы определяете своего собственного оператора &&, он конфликтует с тем, который был автоматически импортирован в Prelude. Чтобы использовать && без квалификации, вы должны скрывать Prelude.&& следующим образом:

import Prelude hiding ((&&)) 

(&&) :: Bool -> Bool -> Bool 
True && b = b 
False && _ = False 

Вторая ошибка ошибка или опечатка в типе and', который должен быть and' :: [Bool] -> Bool, а не and' :: (Bool) -> Bool.

5

Как @zakyggaps сказал в своем комментарии, (Bool) - это то же самое, что и Bool. Вы явно имеете в виду [Bool]. Кроме того, вы на самом деле не «перегружаете» эту функцию так же, как определение аналогично названного в другом модуле. «Тень» в лучшем случае, но даже не это.

+0

Больше, чем просто так названо, на самом деле ... –