Δοκιμές στο track Haskell

Μάθε πώς να δοκιμάζεις τις ασκήσεις σου στη Haskell στο Exercism


Εκτέλεση δοκιμών

Τρέξε την παρακάτω εντολή στον φάκελο της άσκησής σου για να εκτελέσεις τις δοκιμές:

stack test

Για να εκτελούνται οι δοκιμές σε κάθε αποθήκευση αρχείου, τρέξε αυτή την εντολή:

stack test --file-watch

Αν σου εμφανιστεί ένα μήνυμα σφάλματος σαν αυτό...

No .cabal file found in directory

Πιθανότατα τρέχεις μια παλιά έκδοση του stack και πρέπει να την αναβαθμίσεις.

Διαφορετικά, αν σου εμφανιστεί ένα μήνυμα σφάλματος σαν αυτό...

No compiler found, expected minor version match with...
Try running "stack setup" to install the correct GHC...

Απλώς κάνε ό,τι λέει και θα κατεβάσει και θα εγκαταστήσει τη σωστή έκδοση του μεταγλωττιστή:

stack setup

Επίλυση της άσκησης

Η λύση μιας άσκησης είναι μια μονάδα Haskell. Το όνομα της μονάδας ορίζεται σε μια εντολή εισαγωγής στο αρχείο δοκιμών, συνήθως στην αρχή:

import Test.Hspec        (Spec, describe, it, shouldBe)
import Test.Hspec.Runner (configFailFast, defaultConfig, hspecWith)

import ModuleName (someFunc)

main :: IO ()
main ...

Σε αυτό το παράδειγμα, το αρχείο δοκιμών εισάγει, στη γραμμή 4, μια μονάδα με το όνομα ModuleName, που εξάγει μια συνάρτηση με το όνομα someFunc. Αυτό σημαίνει ότι πρέπει να δημιουργήσεις ένα αρχείο με το όνομα ModuleName.hs που θα είναι κάπως έτσι:

module ModuleName (someFunc) where

someFunc :: ...
someFunc ...

Θα βρεις ένα αρχείο με αυτό το όνομα ήδη στη θέση του στο src/, το οποίο μπορείς να χρησιμοποιήσεις ως σημείο εκκίνησης για τη λύση σου.

Απλώς έχε υπόψη ότι αυτό το stub υπάρχει μόνο για να ξεκινήσεις. Μη διστάσεις να το αλλάξεις εντελώς αν πιστεύεις ότι είναι το σωστό.

Χρήση πακέτων

Αν θέλεις να χρησιμοποιήσεις κάποια πακέτα για να γράψεις μια πιο κομψή λύση, πρώτα πρόσθεσε τα πακέτα στις εξαρτήσεις της λύσης σου στο package.yaml:

library:
  exposed-modules: ModuleName
  source-dirs: src
  dependencies:
    - foo
    - bar

Όταν δουλεύεις τοπικά, μπορείς να χρησιμοποιήσεις όποια πακέτα θέλεις. Ο διαδικτυακός εκτελεστής δοκιμών, ωστόσο, έχει πρόσβαση μόνο σε ένα περιορισμένο σύνολο πακέτων. Τα διαθέσιμα πακέτα είναι

  • αυτά που έρχονται προεγκατεστημένα με τη GHC (κυρίως τα base, containers, array, time, mtl, deepseq, exceptions, bytestring), και επιπλέον
  • αυτά που είναι προκατασκευασμένα για τον εκτελεστή δοκιμών, όπως αναφέρονται στο haskell-test-runner/pre-compiled/package.yaml.

Αν υποβάλεις μια λύση που χρησιμοποιεί ένα πακέτο που δεν είναι διαθέσιμο, τότε ο εκτελεστής δοκιμών θα πέσει πάνω στην έλλειψη πρόσβασης στο διαδίκτυο και θα βγάλει ένα σφάλμα που μοιάζει κάπως έτσι:

Cabal file info not found for unavailable-package-1.0@..., updating
Selected mirror https://hackage.haskell.org/
Downloading root
HttpExceptionRequest Request {
  host                 = "hackage.haskell.org"
  ...
}
 (ConnectionFailure ...)

Εκτέλεση του GHCi

Αν θέλεις να παίξεις με τη λύση σου στη GHCi, απλώς τρέξε την εντολή:

stack ghci

HLint (προαιρετικό)

Συνιστάται ανεπιφύλακτα να τρέξεις το hlint πάνω στη λύση σου για να δεις αν πιάνει κάτι που σου ξεφεύγει:

hlint ModuleName.hs

Δεν χρειάζεται να δεχτείς όλες τις προτάσεις του hlint, αλλά συνήθως θα σε βοηθήσουν να μάθεις πώς να γράφεις όμορφο, ιδιωματικό κώδικα σε Haskell.