我是一個新人從書本上學習:
data Day
= Monday
| Tuesday
| Wednesday
| Thursday
| Friday
| Saturday
| Sunday
deriving (Eq, Ord, Show, Read, Bounded, Enum)
我以為我可以寫一個func來使用 ,例如:Monday 1 = Tuesday
所以:
:{
( ) :: Day -> Int -> Day
( ) x y
| y>0 = ( ) (succ x) (y-1)
| y<0 = ( ) (pred x) (y 1)
| y==0 = x
:}
但是ghci說有錯誤:
? Couldn't match expected type ‘Int’ with actual type ‘Day’
? In the second argument of ‘( )’, namely ‘(y 1)’
In the expression: ( ) (pred x) (y 1)
In an equation for ‘ ’:
( ) x y
| y > 0 = ( ) (succ x) (y - 1)
| y < 0 = ( ) (pred x) (y 1)
| y == 0 = x
我不知道為什么,但我嘗試了另一個:
:{
( ) :: (Enum a) => a -> Int -> a
( ) x y
| y>0 = ( ) (succ x) (y-1)
| y<0 = ( ) (pred x) (y 1)
| y==0 = x
:}
它運行良好,例如:
ghci> Monday 1
Tuesday
ghci> Monday 3
Thursday
ghci> Thursday (-2)
Tuesday
但我仍然不知道Day -> Int -> Day.
uj5u.com熱心網友回復:
當您定義一個名為 的函式時( ),您就隱藏了 Prelude 的加法函式。在 的正文中( ) :: Day -> Int -> Day,您進行評估(y 1),期待一個Int. 但是這個新( )函式回傳一個Day! Enum作品的多型版本,因為Int有一個Enum實體,所以( )可以在兩種型別上使用。
為了解決這個問題,你可以簡單地給這個操作一個新的名字而不是 shadowing ( )。或者,您可以明確地在遞回呼叫中何時使用新的( )和原始的,通過撰寫(y Prelude. 1).
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/398715.html
標籤:哈斯克尔
