Haskell 如何在绑定中使用let或where语句
我正在编写Haskell 如何在绑定中使用let或where语句,haskell,functional-programming,Haskell,Functional Programming,我正在编写hspec测试套件,它使用如下绑定: it "should take the x component" $ do (getX $ coord $ [1,0,2]) `shouldBe` 1 但是,对于更复杂的语句,一行代码不便于阅读,因此我尝试在中去掉变量,其中表达式: it "should take the x component" $ do (getX c) `shouldBe` 1 where c = coord $ [1,0,2] 但这在Has
hspec
测试套件,它使用如下绑定:
it "should take the x component" $ do
(getX $ coord $ [1,0,2]) `shouldBe` 1
但是,对于更复杂的语句,一行代码不便于阅读,因此我尝试在中去掉变量,其中表达式:
it "should take the x component" $ do
(getX c) `shouldBe` 1
where c = coord $ [1,0,2]
但这在Haskell中证明是非法的。使用let
也不会成功
it "should take the x component" $ do
let c = coord $ [1,0,2]
in (getX c) `shouldBe` 1
如何为do
binding中的let
或where
分配帮助变量?浏览文档,但找不到好的例子。如果没有更多的上下文,很难说第一个失败的原因。第二个失败是因为let
在do
块中的工作方式不同。要么将缩进另一对空格,要么删除中的关键字,并使行的其余部分与关键字对齐,让中的语句不需要中的。换句话说,请尝试以下方法:
it "should take the x component" $ do
let c = coord $ [1,0,2]
(getX c) `shouldBe` 1
顺便说一下,getxc
周围的括号是多余的。coord
和[1,0,2]
之间的$
也是如此。和getX$coord$[1,0,2]
可能应该写成getX(coord[1,0,2])
或getX。coord$[1,0,2]
。感谢您的建议。事实上,这个陈述只是这个问题的一个简化样本。我的实际测试语句对于分组来说要复杂得多,所以我真的需要let
或where
。我不是说let
或where
,而是说你是如何编写这两个表达式的。我没有意识到这需要在中额外缩进,甚至忽略它。听起来有点语法不一致。@TaoP.R。它遵循适用于do
的。基本上,以这种方式缩进意味着do{let c=…;在getX c…}
makingin…
在do
块中,除了第一个条目之外的第二个条目是错误的。顺便说一下,您也可以在这里简单地删除do
,因为该块中只有一个条目,所以我们不能启动一个块而忘记缩进。