【发布时间】:2013-05-15 05:36:26
【问题描述】:
这个问题与我的other question有关smallCheck的Test.SmallCheck.Series类有关。当我尝试以以下自然方式定义类 Serial 的实例时(@tel 对上述问题的回答向我建议),我得到编译器错误:
data Person = SnowWhite | Dwarf Int
instance Serial Person where ...
原来Serial 想要有两个参数。反过来,这需要一些编译器标志。以下作品:
{-# LANGUAGE FlexibleInstances, MultiParamTypeClasses #-}
import Test.SmallCheck
import Test.SmallCheck.Series
import Control.Monad.Identity
data Person = SnowWhite | Dwarf Int
instance Serial Identity Person where
series = generate (\d -> SnowWhite : take (d-1) (map Dwarf [1..7]))
我的问题是:
-
把
Identity放在那里是“正确的做法”吗?我的灵感来自Test.Series.list函数的类型(当我第一次看到它时我也觉得非常奇怪):list :: Depth -> Series Identity a -> [a]什么是正确的做法?如果我一看到
Identity就盲目地输入它,我会好吗?我应该改用Serial m Integer => Serial m Person之类的东西吗(这需要一些看起来更可怕的编译器标志:至少FlexibleContexts和UndecidableInstances)? -
第一个参数(
Serial m n中的m)是做什么用的?谢谢!
【问题讨论】:
标签: testing haskell automated-tests monads smallcheck