[英]How can I change the type of my Haskell function
我有一個具有類型的函數:
mulPoly :: Poly -> Poly -> Poly
但我想要一種類型:
mulPoly :: (Num a, Eq a) => Poly a -> Poly a -> Poly a
如何轉換此 Haskell 代碼:
data Poly = [Int] deriving (Show, Eq)
mulPoly :: Poly -> Poly -> Poly
mulPoly (a:as) bs =
addPoly (scale a bs) (0 : mulPoly as bs)
到這種類型:
data Poly a = P [a] deriving (Show, Eq)
mulPoly :: Poly a -> Poly a -> Poly a
這里是已經在Poly a
類型上定義的函數addPoly
和scale
addPoly :: (Num a, Eq a) => Poly a -> Poly a -> Poly a
addPoly (P as) (P bs) = P (inner as bs)
where
inner [] ys = ys
inner xs [] = xs
inner (x:xs) (y:ys) = (x+y) : inner xs ys
scale :: (Num a, Eq a) => a -> Poly a -> Poly a
scale 0 (P (x:xs)) = P []
scale y (P []) = P []
scale y (P (x:xs)) = P (map (y*) (x:xs))
只需要在適當的地方做一些包裝和展開:
mulPoly :: (Num a, Eq a) => Poly a -> Poly a -> Poly a
mulPoly (P []) _ = P [] -- you were missing this case
mulPoly (P (a:as)) bs =
addPoly (scale a bs)
(shift1 $ mulPoly (P as) bs)
where
shift1 (P bs) = P (0:bs)
我們只需要注意哪些將原始列表作為參數,以及哪些將它們包裝在P
標簽下,並相應地調整您的原始代碼。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.