如何在绑定中使用let或where语句

时间:2016-01-26 03:34:09

标签: haskell functional-programming

我正在编写使用绑定的hspec测试套件,如下所示:

it "should take the x component" $ do
    (getX $ coord $ [1,0,2]) `shouldBe` 1

但是,对于更复杂的语句,单行代码不方便读取,所以我尝试在where表达式中删除变量:

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

如何在let绑定中为wheredo分配辅助变量?探索文档,但无法找到一个好的例子。

2 个答案:

答案 0 :(得分:4)

很难说为什么第一个失败而没有看到更多的背景。第二个失败,因为letdo块中的工作方式不同。要么缩进in另外几个空格,要么删除关键字in,然后将该行的其余部分与关键字let对齐。

答案 1 :(得分:4)

.factory('socket', function($rootScope, $timeout, socketFactory, $q, $log) { // create a promise instance var socket = $q.defer(); // listen for the authenticated event emitted on the rootScope of // the Angular app. Once the event is fired, create the socket and resolve // the promise. $rootScope.$on('authenticated', function() { // resolve in another digest cycle $timeout(function() { var token = window.localStorage["socket_token"]; var token_query = 'token=' + token; var newSocket = (function() { return socketFactory({ ioSocket: io.connect('http://example.com:3000', { query: token_query }) }); })(); socket.resolve(newSocket); }); }); return socket.promise }); 内的

let语句不需要do关键字。换句话说,试试这个:

in