HaskellのStackでdoctestを行うとQuickCheck使用時にエラーが出る


このエントリーをはてなブックマークに追加

結論から言うと、実行時にexecをつけて実行してやればQuickCheck使用時のエラーが出なくなった

1
$ stack exec doctest DoctestSample.hs

Haskellを色々とやってみている
CentOSでHaskellプログラミング始め

で、2015年からHaskellを始めるにはstackというツールを使ってやるのがよいということでやってみているが

書籍ではまだcabalコマンドなどが出てきて、stackではエラーとなることもあるみたい


doctestとQuickCheck


関数プログラミング実践入門
のdoctestのところをやってみている

doctest自体はひとまず下記stackコマンドで入れてみた
(もしかしたらプロジェクトの依存性などあるからcabalファイルに記述したほうがいいかもしれないがまだよくわからない・・・)

1
$ stack install doctest

これで、doctestコマンドが使えるので書籍通りにdoctestを使ってみればいい


QuickCheckでエラーになる


そのままQuickCheckも試してみようとすると、エラーになってしまう

下記ファイルをdoctestするとして

DoctestSample.hs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
module DoctestSample where
-- | 文字列中のスペースの個数
--
-- >>> countSpace ""
-- 0
-- >>> countSpace "abracadabra"
-- 0
-- >>> countSpace "Hello, World!"
-- 1
-- >>> countSpace " "
-- 4
--
-- prop> countSpace s == sum [1 | c <- s, c == ' ']
--
countSpace :: String -> Int
countSpace = length . filter (' ' ==)


普通にdoctestコマンドを実行すると以下のようにエラーになった

1
2
3
4
5
6
7
8
9
10
11
12
13
14
$ doctest DoctestSample.hs
### Failure in DoctestSample.hs:14: expression `countSpace s == sum [1 | c <- s, c == ' ']'
<interactive>:47:3:
Not in scope: ‘polyQuickCheck’
In the splice: $(polyQuickCheck (mkName "doctest_prop"))
<interactive>:47:3:
GHC stage restriction:
‘polyQuickCheck’ is used in a top-level splice or annotation,
and must be imported, not defined locally
In the expression: polyQuickCheck (mkName "doctest_prop")
In the splice: $(polyQuickCheck (mkName "doctest_prop"))
Examples: 5 Tried: 5 Errors: 0 Failures: 1

なんだと思って調べてみると以下がヒットした
QuickCheck does not work

doctestコマンド単体で行うとエラーになるのでstack exec doctestコマンドでやると良いよ、とのことなので実行してみる


1
2
$ stack exec doctest DoctestSample.hs
Examples: 5 Tried: 5 Errors: 0 Failures: 0

成功した!
良かった


このエントリーをはてなブックマークに追加