Je suis en train d'apprendre Haskell, donc c'est probablement quelque chose de plutôt trivial, mais j'apprécierais quelques conseils sur la façon de le réécrire et comment cela fonctionne.Refactoring où la clause
Je suit le code de travail (packages utilisés: HTF, Parsec et Flow):
{-# OPTIONS_GHC -F -pgmF htfpp #-}
{-# LANGUAGE FlexibleContexts #-}
module Main where
import Test.Framework -- assertEqual, assertBool, htfMain, htf_thisModulesTests
import Text.ParserCombinators.Parsec (eof, spaces, parse)
import Flow ((|>))
import Data.Either (isLeft)
whiteSpaces = spaces
test_parse_whitespace = do
mapM_ positive [
"", " ", "\t", "\n", "\r\n", " \r\n ",
" \t \r\n \t \n \r \t "
]
mapM_ negative ["x", " x", "x ", " x ", "\t_\t"]
where
parser = whiteSpaces >> eof
parseIt = parse parser ""
positive str = assertEqual (parseIt str) (Right())
negative str = assertBool (parseIt str |> isLeft)
main :: IO()
main = htfMain htf_thisModulesTests
J'ajoute un nouveau test qui ont presque la même la où une partie, alors j'ai essayé de le refactoriser comme ceci:
pos_neg_case parser = do
return [positive, negative]
where
fullParser = parser >> eof
parseIt = parse fullParser ""
positive str = assertEqual (parseIt str) (Right())
negative str = assertBool (parseIt str |> isLeft)
test_parse_whitespace' = do
mapM_ positive [
"", " ", "\t", "\n", "\r\n", " \r\n ",
" \t \r\n \t \n \r \t "
]
mapM_ negative ["x", " x", "x ", " x ", "\t_\t"]
where
[positive, negative] = pos_neg_case whiteSpaces
Ce qui ne fonctionne pas (même lorsque j'active la fonction lang. Comme le suggère le compilateur).
Couldn't match expected type ‘[Char] -> m b0’
with actual type ‘[String -> IO()]’
Relevant bindings include
test_parse_whitespace' :: m() (bound at test/Spec.hs:21:1)
In the first argument of ‘mapM_’, namely ‘positive’
In a stmt of a 'do' block:
mapM_ positive ["", " ", "\t", "\n", ....]
Couldn't match expected type ‘[Char] -> m b1’
with actual type ‘[String -> IO()]’
Relevant bindings include
test_parse_whitespace' :: m() (bound at test/Spec.hs:21:1)
In the first argument of ‘mapM_’, namely ‘negative’
In a stmt of a 'do' block:
mapM_ negative ["x", " x", "x ", " x ", ....]
'assertEqual' et' assertBool' proviennent du [* HTF *] (http://hackage.haskell.org/package/HTF-0.13.1.0/docs/Test-Framework-HUnitWrapper.html), alors que '(|>)' provient de [* flux *] (https://hackage.haskell.org/package/flow-1.0.7/docs/Flow .html) et est juste un synonyme de 'flip ($)' et '(&)'. (Mentionner les paquets pas très connus que vous utilisez pour des questions plus claires.) – duplode
@duplode Oh, merci (je pensais que les importations étaient suffisantes). Je savais que * flow * n'est pas très populaire parmi les Haskellers, mais * HTF * n'est pas aussi populaire? Y at-il une meilleure alternative qui peut exécuter tous les tests unitaires dans un module sans passe-partout? – monnef
"Je pensais que les importations étaient suffisantes" - Elles sont suffisantes dans le sens où elles fournissent suffisamment d'informations pour les rechercher et éventuellement les trouver ainsi que les fonctions pertinentes. C'est juste une question de commodité pour les lecteurs de la question. (Je n'ai rien à dire contre l'un des paquets que vous avez utilisé.) – duplode