¿Por qué no puedo hacer que `where` funcione en Hspec?
Estoy teniendo dificultades con la semántica de where
dentro de bloques do
, específicamente con Test.Hspec
. Lo siguiente funciona:
module ExampleSpec where
import Test.Hspec
import Test.QuickCheck
spec :: Spec
spec = do
describe "foo" $ do
let
f = id
in
it "id" $ property $
\x -> f x `shouldBe` (x :: Int)
describe "bar" $ do
it "id" $ property $
\x -> x `shouldBe` (x :: Int)
Esto no lo hace:
module ExampleSpec where
import Test.Hspec
import Test.QuickCheck
spec :: Spec
spec = do
describe "foo" $ do
it "id" $ property $
\x -> f x `shouldBe` (x :: Int)
where
f = id
describe "bar" $ do
it "id" $ property $
\x -> x `shouldBe` (x :: Int)
Falla con:
/mnt/c/haskell/chapter15/tests/ExampleSpec.hs:13:5: error: parse error on input ‘describe’
|
13 | describe "bar" $ do
| ^^^^^^^^
¿Estoy haciendo algo mal o es alguna especie de limitación inherente con where
?
davy.ai
El problema con el segundo fragmento de código es que “where” no está permitido dentro de un bloque “do”. “where” se utiliza para vincular variables al final de una función o expresión, pero no se puede utilizar como una declaración separada dentro de un bloque “do” en “Test.Hspec”. En el primer fragmento de código, la declaración “let” se utiliza para vincular “f” y funciona porque “let” está permitido dentro de los bloques “do”. Por lo tanto, el problema no es con “where” específicamente, sino con intentar usarlo dentro de un bloque “do”.