do块中的不同行

我想使用 hspec 创建一些具有不同值的测试。我写了下面的代码,它不能编译但给出了我的目标:

spec :: Spec
spec = do
    describe "productOneLine" $ do
        let
            inVector = Data.Vector.replicate 0 0
            inInteger = 3
            outVector = Data.Vector.replicate 1 0
        in
            it "must manage empty vector" $ productOneLine inVector inInteger `shouldBe` outVector
        let
            inVector = Data.Vector.fromList [2, 4, 5]
            inInteger = 4
            outVector = Data.Vector.fromList [9, 6, 1, 2]
        in
            it "must multiply a vector by an integer" $ productOneLine inVector inInteger `shouldBe` outVector

如何为每个以 开头的 ligne创建不同的inVector, inIntegeret集?outVectorit

回答

假设您收到错误:

parse error on input `in'

根据@n.`pronouns'm. 的评论,问题只是缩进。

在大多数情况下,一个let块可以用letin关键字排列:

foo a b = let a2 = a*a
              b2 = b*b
          in a2 + b2
          ^
          `- let and in starting at same column

事实上, thein可以比 缩进少let,它只需要比 缩进更多foo

foo a b = let a2 = a*a
              b2 = b*b
  in a2 + b2

但是,在do块中,允许使用in-lesslet语句:

main = do
  let s = "Hello"
  putStrLn s

如果您尝试编写:

main = do
  let s = "Hello"
  in PutStrLn s

thelet s = "Hello"被解析为一条let语句,而 thein PutStrLn s被解析为第二条do语句,语法无效,因为它以保留字开头in

你可以写:

main = do
  let s = "Hello" in
    putStrLn s

或者:

main = do
  let s = "Hello"
    in putStrLn s

或者:

main = do
  let s = "Hello"
    in 
    putStrLn s

在每种情况下,缩进都会导致整个表达式let ... in ...被解析为单个表达式,这本身就是一个有效的do-statement。将两个这样的语句结合起来很容易:

main = do
  let s = "Hello"
    in
    putStrLn s
  let s = "Goodbye"
    in
    putStrLn s


以上是do块中的不同行的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>