How do I define a data type consisting of other data types?

后端 未结 2 1126
失恋的感觉
失恋的感觉 2021-01-14 20:50

I want to define the data type Currency, which consists of three other data types. I have the problem that Haskell doesn\'t recognize the data types as a part of currency, w

相关标签:
2条回答
  • 2021-01-14 21:15

    The issue with what you attempted is that the Euro, Dollar and Yen defined on the first 3 lines (on the left-hand-side of the = signs) are types, whereas those in the last line, on the right-hand-side, are data constructors. These are different things, which is why you're allowed to give them the same names - but also means that the value Dollar has the type Currency, not the type Dollar.

    You had the right idea to create a union type combining the other three - but you are confusing the data constructors (which are just "tags") with the types of the values they hold. You can fix it like this:

    data Currency = Euro Euro | Dollar Dollar | Yen Yen
    

    That might look confusing to have the same name twice (three times, too) - but the two occurrences of the name have different meanings. In Euro Euro, for example, the first Euro is a data constructor (a function which "tags" the value), while the second is the type on which the constructor function operates.

    0 讨论(0)
  • 2021-01-14 21:27

    Currently your Currency is constructed as three values, that take no parameters. So Euro is a value, Dollar is a value, and Yen is a value, but not MkYen 15.

    You can add parameters to your data constructors like:

    data Currency = Euro Euro | Dollar Dollar | Yen Yen

    Then you thus can construct a Currency with:

    Euro (MkEuro 14 25) :: Currency

    The :: Currency is not necessary. The MkEuro will thus construct an object of the Euro type, and then we use the Euro data constructor with type Euro -> Currency to construct a Currency.

    Sadly I have to use the type Currency and can't create different functions for all three currencies.

    You might want to make a Currency typeclass however, that provides an interface that says what functions a currency should implement, and then make Euro, Dollar, and Yen instances of that typeclass.

    0 讨论(0)
提交回复
热议问题