2016-02-19 55 views
0

我有一個HS文件,試圖超載& &操作超載全球&&運營商在Haskell編譯失敗

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

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

當前奏進口的,有錯誤:

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 

現在它打印新的er 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

不僅僅是同樣的名字,實際上...... –