es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿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?

Tags:  , ,

Answer

  1. Avatar for 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”.

Comments are closed.