簡體   English   中英

如何更改 Haskell 函數的類型

[英]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類型上定義的函數addPolyscale

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM