haskell 对Num和List都有效的函数

nwlqm0z1  于 2022-11-14  发布在  其他
关注(0)|答案(2)|浏览(168)

我将此作为一个模式匹配练习。
我希望有一个函数,将工作在Num类型和List类型。例如:

double 20
double [1,2,3,4,5]

代码工作到

double [] = []
double (x : xs) = (2 * x) : (double xs)

main = do
    let x = [1,2,3,4,5]
    print (double x)

但当我试着:

double x = x + x
double [] = []
double (x : xs) = (2 * x) : (double xs)

main = do
    let x = [1,2,3,4,5]
    print (double 20)
    print (double x)

它会产生错误。
这里应该怎么办?

nmpmafwu

nmpmafwu1#

正如chi所提到的,最好有单独的函数,我想补充的是,特别是在学习的时候,考虑和编写函数的类型签名是一个good habit
为了回答你的问题,你还是可以这样做的。
您告诉Haskell Integer[Integer]数据类型“可以加倍”,然后定义如何为每种类型加倍。我知道这比您所要求的要高级得多:)

{-# LANGUAGE FlexibleInstances #-}

class CanDouble a where
    double :: a -> a

instance CanDouble Integer where
    double = (*2)

instance CanDouble [Integer] where
    double = map (*2)
> double 5
10
> double [1,2,3]
[2,4,6]
k5ifujac

k5ifujac2#

除了哈伦的答案中的using typeclasses,你还可以使用Either Int [Int]

double :: Either Int [Int] -> Either Int [Int]
double (Left n) = Left $ n * 2
double (Right lst) = Right $ map (* 2) lst 
ghci> double (Left 5)
Left 10
ghci> double (Right [1,2,3])
Right [2,4,6]

相关问题