這個問題與我的other question有關smallCheck
的Test.SmallCheck.Series
類。當我嘗試在以下自然的方式(通過@tel上述問題的答案建議我)來定義類Serial
的一個實例,我得到的編譯器錯誤:爲什麼smallCheck的`Series`類在構造函數中有兩種類型?
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
有 「做正確的事」?list :: Depth -> Series Identity a -> [a]
什麼是正確的事情:我被
Test.Series.list
函數的類型(我也發現非常奇怪的,當我第一次看到它)的啓發?如果我一看到Identity
就會盲目放入,我會沒事的嗎?我應該把類似Serial m Integer => Serial m Person
的東西,(至少需要一些更可怕的編譯器標誌:FlexibleContexts
和UndecidableInstances
)?什麼是第一個參數(
m
在Serial m n
)?謝謝!
非常感謝您給出了一個很好的答案和解釋!你的例子工作,它應該真的在文檔中。雖然,我必須承認,我很生氣,我必須明白'Series(ReaderT Depth(LogicT m)a)'意味着僅僅爲了一個具體目的而使用一個庫。 –
你並不需要關心'LogicT'使用smallcheck。 – aleator
好吧,也許我不需要*更多*的細節。但是,正因爲如此,我永遠無法猜測我應該怎麼做才能讓我的代碼在沒有您的幫助的情況下工作。 –