在Haskell中使用数据类型重载函数

时间:2016-11-21 15:51:01

标签: haskell overloading

如果我已经声明了数据类型:

data ExampleType = TypeA (Int, Int) | TypeB (Int, Int, Int)

如何声明一个接受TypeA或TypeB的函数并在此基础上执行不同的操作?我目前的尝试是:

exampleFunction :: ExampleType -> Int
exampleFunction (TypeA(firstInt, secondInt)) = --Fn body
exampleFunction (TypeB(firstInt, secondInt, thirdInt)) = --Fn body

但我收到Duplicate type signatures错误,所以我明显遗漏了一些东西。任何帮助都会很棒,谢谢!

2 个答案:

答案 0 :(得分:4)

适合我:

data ExampleType = TypeA (Int, Int) | TypeB (Int, Int, Int)

exampleFunction :: ExampleType -> Int
exampleFunction (TypeA (a,b)) = a + b
exampleFunction (TypeB (a,b,c)) = a + c + c

main = print $ exampleFunction (TypeA (2,3))

http://ideone.com/jsIBVF

请注意,您通常不会将元组用作类型的组件,因为这使得很难获取数据。如果你没有一个很好的理由,那就干脆使用吧 data ExampleType = TypeA Int Int | TypeB Int Int Int

答案 1 :(得分:2)

您的代码不应导致此类错误。但是你的问题有些问题。首先,对于产品类型(TypeA (Int, Int)),使用元组是不常见的。相反,您只需将TypeA声明为数据构造函数,该构造函数接受类型为Int的两个参数,而不是(Int, Int)类型的参数。此外,TypeATypeB不是两种不同的类型,而是具有相同和类型ExampleType的两种不同的数据构造函数。为了反映我在以下代码中将其重命名为DataADataB

data ExampleType = DataA Int Int | DataB Int Int Int
exampleFunction :: ExampleType -> Int
exampleFunction (DataA x y) = x + y
exampleFunction (DataB x y z) = x + y + z