저는 haskell을 처음 사용하고 있으며 hspec을 동시에 배우려고합니다.'shouldBe'의 사용으로 인해 (Show a0) 인스턴스가 없습니다.
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 []
([],[])
나를 도와 줄 사람이 있습니까?
GHCi는 다형성 값을 표시하기위한 다른 규칙과 함께'-XExtendedDefaultRules'를가집니다. 'let x :: Num a => a를 시도해보십시오. x = 1' 다음에'x'가옵니다. 그것은'Num'의 어떤 인스턴스를 사용할 지 알지 못하고'1'을 출력합니다. 여기서 문제는 컴파일 할 때 GHC가 사용할'Show '의 버전을 알지 못한다는 것입니다. halve [1]'shouldBe'와 같은 일을 할 수 있습니다. (([], []) : ([Int], [Int])) [], [1]) :: ([Int], [Int]))'''등등. 귀하의 코드는 GHC가 파악 하기엔 너무 다형 적입니다. – bheklilr