我是Haskell的新手,我正在尝试同时学习hspec。
module ExercisesSpec where
import Test.Hspec
import Test.QuickCheck
import Control.Exception (evaluate)
halve :: [a] -> ([a], [a])
halve xs = splitAt (length xs `div` 2) xs
main :: IO ()
main = hspec $ do
describe "halve" $ do
it "0 elements" $ do
halve [] `shouldBe` ([],[])
it "1 element" $ do
halve [1] `shouldBe` ([],[1])
it "2 elements" $ do
halve [1,2] `shouldBe` ([1],[2])
it "3 elements" $ do
halve [1,2,3] `shouldBe` ([1],[2,3])
it "4 elements" $ do
halve [1,2,3,4] `shouldBe` ([1,2],[3,4])
尽管其余测试通过,但 0 元素的测试失败。
No instance for (Show a0) arising from a use of ‘shouldBe’
The type variable ‘a0’ is ambiguous
Note: there are several potential instances:
instance Show Double -- Defined in ‘GHC.Float’
instance Show Float -- Defined in ‘GHC.Float’
instance (Integral a, Show a) => Show (GHC.Real.Ratio a)
-- Defined in ‘GHC.Real’
...plus 38 others
In a stmt of a 'do' block: halve [] `shouldBe` ([], [])
In the second argument of ‘($)’, namely
‘do { halve [] `shouldBe` ([], []) }’
In a stmt of a 'do' block:
it "0 elements" $ do { halve [] `shouldBe` ([], []) }
当我在ghci中尝试时,它工作正常。
*Exercises> halve []
([],[])
有人可以帮助我吗?
啊,为了回答我自己的问题,我看到我需要使类型更具体。如果我在我的函数上方添加halve :: [Int] -> ([Int], [Int])
它就可以工作。
引用我在课堂讨论室读到的好答案:
PBL64K
通常,对于列表,肯定没有可派生的 Show 实例。函数列表呢?REPL 推断具有 Show 实例的具体类型。但不要指望[a]一般会有一个 - 除非你自己做一个。
树鸮
PBL64K有点对,也有错。如果 a 有一个 Show 实例,则 [a] 有一个 Show 实例。它是自动派生的。这里的麻烦在于Haskell不知道它是哪个实例。[] 可能看起来像一个单一的值(在机器代码中,它可能是),但在 Haskell 级别,它是一个多态构造函数。它可以采用任何列表类型,因此您必须做一些事情来说明您希望它具有哪种列表类型。