{"id":1358,"date":"2021-04-02T19:11:48","date_gmt":"2021-04-03T02:11:48","guid":{"rendered":"https:\/\/coderpad-staging.io\/?post_type=programming-language&#038;p=1088"},"modified":"2025-12-04T03:53:46","modified_gmt":"2025-12-04T11:53:46","slug":"haskell","status":"publish","type":"programming-language","link":"https:\/\/coderpad.io\/languages\/haskell\/","title":{"rendered":"Haskell"},"content":{"rendered":"\n<p>Your code is run with&nbsp;<code>runghc solution.hs<\/code>. Your code runs in interpreted mode, so you don\u2019t need a special entrypoint.<\/p>\n\n\n\n<p>We have a couple testing options available. Simple tests using&nbsp;<a href=\"https:\/\/hspec.github.io\/\" target=\"_blank\" rel=\"noopener\">Hspec<\/a>&nbsp;are straightforward:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-1\" data-shcb-language-name=\"Haskell\" data-shcb-language-slug=\"haskell\"><span><code class=\"hljs language-haskell shcb-wrap-lines\"><span class=\"hljs-keyword\">import<\/span> Test.Hspec\n<span class=\"hljs-keyword\">import<\/span> Test.QuickCheck\n<span class=\"hljs-keyword\">import<\/span> Control.Exception (<span class=\"hljs-title\">evaluate<\/span>)\n\n<span class=\"hljs-title\">main<\/span> :: <span class=\"hljs-type\">IO<\/span> ()\n<span class=\"hljs-title\">main<\/span> = hspec $ <span class=\"hljs-keyword\">do<\/span>\n  describe <span class=\"hljs-string\">\"Prelude.head\"<\/span> $ <span class=\"hljs-keyword\">do<\/span>\n    it <span class=\"hljs-string\">\"returns the first element of a list\"<\/span> $ <span class=\"hljs-keyword\">do<\/span>\n      head &#91;<span class=\"hljs-number\">23<\/span> ..] `shouldBe` (<span class=\"hljs-number\">23<\/span> :: <span class=\"hljs-type\">Int<\/span>)\n\n    it <span class=\"hljs-string\">\"returns the first element of an *arbitrary* list\"<\/span> $\n      property $ \\x xs -&gt; head (x:xs) == (x :: <span class=\"hljs-type\">Int<\/span>)\n\n    it <span class=\"hljs-string\">\"throws an exception if used with an empty list\"<\/span> $ <span class=\"hljs-keyword\">do<\/span>\n      evaluate (head &#91;]) `shouldThrow` anyException\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-1\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">Haskell<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">haskell<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>You can also use&nbsp;<a href=\"http:\/\/hackage.haskell.org\/package\/QuickCheck\" target=\"_blank\" rel=\"noopener\">QuickCheck\u2019s<\/a>&nbsp;more powerful test generation framework directly (this test fails):<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-2\" data-shcb-language-name=\"Haskell\" data-shcb-language-slug=\"haskell\"><span><code class=\"hljs language-haskell shcb-wrap-lines\"><span class=\"hljs-keyword\">import<\/span> Test.QuickCheck\n\n<span class=\"hljs-title\">prop_revapp<\/span> :: &#91;<span class=\"hljs-type\">Int<\/span>] -&gt; &#91;<span class=\"hljs-type\">Int<\/span>] -&gt; <span class=\"hljs-type\">Bool<\/span>\n<span class=\"hljs-title\">prop_revapp<\/span> xs ys = reverse (xs++ys) == reverse xs ++ reverse ys\n\n<span class=\"hljs-title\">main<\/span> = quickCheck prop_revapp\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-2\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">Haskell<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">haskell<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>We install a variety of packages in the Haskell environment (including&nbsp;<code>req<\/code>&nbsp;for HTTP requests). The output of&nbsp;<code>cabal list --installed --simple<\/code>&nbsp;is below:<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Package<\/th><th>Version<\/th><\/tr><\/thead><tbody><tr><td>HUnit<\/td><td>1.6.2.0<\/td><\/tr><tr><td>QuickCheck<\/td><td>2.14.2<\/td><\/tr><tr><td>SHA<\/td><td>1.6.4.4<\/td><\/tr><tr><td>bytestring<\/td><td>0.11.3.1<\/td><\/tr><tr><td>hashtables<\/td><td>1.3.1<\/td><\/tr><tr><td>hspec<\/td><td>2.10.8<\/td><\/tr><tr><td>network<\/td><td>3.1.2.7<\/td><\/tr><tr><td>parsec<\/td><td>3.1.15.1<\/td><\/tr><tr><td>req<\/td><td>3.13.0<\/td><\/tr><tr><td>split<\/td><td>0.2.3.5<\/td><\/tr><tr><td>text<\/td><td>2.0.1<\/td><\/tr><tr><td>unordered-containers<\/td><td>0.2.19.1<\/td><\/tr><tr><td>vector<\/td><td>0.13.0.0<\/td><\/tr><tr><td>vector-algorithms<\/td><td>0.9.0.1<\/td><\/tr><\/tbody><\/table><\/figure>\n","protected":false},"parent":0,"menu_order":0,"template":"","class_list":["post-1358","programming-language","type-programming-language","status-publish","hentry"],"acf":[],"_links":{"self":[{"href":"https:\/\/coderpad.io\/wp-json\/wp\/v2\/programming-language\/1358","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/coderpad.io\/wp-json\/wp\/v2\/programming-language"}],"about":[{"href":"https:\/\/coderpad.io\/wp-json\/wp\/v2\/types\/programming-language"}],"wp:attachment":[{"href":"https:\/\/coderpad.io\/wp-json\/wp\/v2\/media?parent=1358"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}