我試圖重新定義monad列表實例使用newtype來創建一個包裝列表類型,以便完成這一切,因爲它看起來Prelude定義無法被覆蓋。重新定義單子列表實例
到目前爲止,我有以下幾點:
newtype MyList a = MyList { unMyList :: [a] }
deriving Show
myReturn :: a -> [a]
myReturn x = [x]
myBind :: [a] -> (a -> [b]) -> [b]
myBind m f = concat $ map f m
instance Monad MyList where
return x = MyList [x]
xs >>= f = undefined
作爲哈斯克爾初學者,我很茫然知道如何界定>> =運算符的情況下,用我的函數的定義綁定。
myReturn和myBind函數應該使用MyList而不是普通類型變量的類型嗎?如何正確定義>> =來進行打包和拆包?
我陷入函數參數映射f,其中f :: a - > [b],但它似乎我需要f :: a - > MyList b,但然後映射將不會接受爲一個論點。
道歉的混亂。所有協助表示讚賞
[我知道有一個類似的問題在這裏:Redefine list monad instance但我怕我跟不上答案有]
你爲什麼要包裝清單以這樣的方式?爲什麼不使用'data List t = Empty |創建一個新的單鏈表t:+(List t)',然後以這種方式重新定義 - 當然這是一個更實用的練習,同樣具有挑戰性? – AJFarmar 2014-12-03 16:36:54