我是初学者,正在尝试学习函数式编程。
有没有办法模式匹配不同的标准(非用户定义)类型?
E.g。如果函数的参数是一个元组,添加它们,如果它只是一个int,则使用int:
Ctrl+C
这显然不会起作用,因为该程序认为any_num只是任何元组,因此无法访问。
答案 0 :(得分:3)
您可以使用type class执行此操作。我们可以定义具有Formable
函数的form
类型的类:
class Formable a where
form :: a -> Int
对于int,只需使用int
instance Formable Int where
form x = x
如果参数是元组,请将其参数添加到一起。我将更进一步,而不是只处理元组(Int, Int)
,只要(a, b)
和{{1},它的可形成实例将适用于任何元组a
是} b
Formable
我们可以用类似的方式为其他类型编写instance (Formable a, Formable b) => Formable (a, b) where
form (a, b) = form a + form b
个实例。就像总计列表中的元素一样
Formable
或和的替代
instance (Formable a) => Formable [a] where
form = sum . map form
甚至instance (Formable a, Formable b) => Formable (Either a b) where
form (Left a) = form a
form (Right b) = form b
,如果我们知道如何处理Maybe
Nothing
答案 1 :(得分:1)
我猜你可以这样做;
form :: Either (Int,Int) Int -> Int
form (Left (n,m)) = n + m
form (Right n) = n
>> form (Left (2,3))
>> 5
>> form (Right 7)
>> 7