data structures - Why won't my test file import my datastructure? Haskell

I am currently writing unit tests for my (very simple) blackjack game and my testfile (Tests.hs) does not seem to import my datastructures that I have declared in the file I am doing unit tests for (HelpFunctions.hs). I can acces the functions/methods in this file but not the datastructures. Can someone please help me find the problem?

This is the top of my testfile:

module Tests(performTests) where
import Test.HUnit
import HelpFunctions

cardList = [(Hearts, Ace)]
(...)

and this is the top of the file that i am going to write tests for

module HelpFunctions(Suit, Value, blackjack, cardDeck, shuffleOne, 
                     shuffleCards, getValue, addHand, dealCard, bust, 
                     getHighest
                    ) where

import System.Random
import Control.Monad(when)

{- Suit is one of the four suits or color of a playing card 
   ie Hearts, Clubs, Diamonds or Spades
   INVARIANT: Must be one of the specified.
 -}
data Suit = Hearts | Clubs | Diamonds | Spades deriving (Show)

{- Value is the numeric value of a playing card according to the rules of blackjack. 
   INVARIANT: Must be one of the specified.
 -}
data Value = Two | Three | Four | Five | Six | Seven | Eight | 
             Nine | Ten | Jack | Queen | King | Ace 
             deriving (Eq, Show)
(...)

And when compiling the testfile I get the error

    Tests.hs:6:14: error: Data constructor not in scope: Hearts
  |
6 | cardList = [(Hearts, Ace)]   |              ^^^^^^

Tests.hs:6:22: error: Data constructor not in scope: Ace
  |
6 | cardList = [(Hearts, Ace)]   |                      ^^^

I have another file that import HelpFunctions and the datastructures from it and that work without problems.

1 Answer

  1. Anthony- Reply

    2019-11-13

    Your problem is here:

    module HelpFunctions(Suit, Value, ...
    

    This line says HelpFunctions exports the types Suit and Value, but not their data constructors (i.e. the types are abstract).

    You want

    module HelpFunctions(Suit(..), Value(..), ...
    

    You could list all constructors explicitly, but the .. shorthand notation means "all data constructors of this type".


    Reference: The Haskell 2010 Language Report, 5.2 Export Lists:

    1. An algebraic datatype T declared by a data or newtype declaration may be named in one of three ways:

      • The form T names the type but not the constructors or field names. The ability to export a type without its constructors allows the construction of abstract datatypes (see Section 5.8).
      • The form T(c1,…,cn), names the type and some or all of its constructors and field names.
      • The abbreviated form T(..) names the type and all its constructors and field names that are currently in scope (whether qualified or not).

Leave a Reply

Your email address will not be published. Required fields are marked *

You can use these HTML tags and attributes <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>