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…}
making
in…
do
块中,除了第一个条目之外的第二个条目是错误的。顺便说一下,您也可以在这里简单地删除
do
,因为该块中只有一个条目,所以我们不能启动一个块而忘记缩进。