如果我已经声明了数据类型:
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
错误,所以我明显遗漏了一些东西。任何帮助都会很棒,谢谢!
答案 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))
请注意,您通常不会将元组用作类型的组件,因为这使得很难获取数据。如果你没有一个很好的理由,那就干脆使用吧
data ExampleType = TypeA Int Int | TypeB Int Int Int
答案 1 :(得分:2)
您的代码不应导致此类错误。但是你的问题有些问题。首先,对于产品类型(TypeA (Int, Int)
),使用元组是不常见的。相反,您只需将TypeA
声明为数据构造函数,该构造函数接受类型为Int
的两个参数,而不是(Int, Int)
类型的参数。此外,TypeA
和TypeB
不是两种不同的类型,而是具有相同和类型ExampleType
的两种不同的数据构造函数。为了反映我在以下代码中将其重命名为DataA
和DataB
。
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