2014-02-25 1 views
-3

편집 : 포럼 운영자 트롤이 종료하기 전에이를 빨리 알아 내려고합니다. (이들은 소급하여 내 게시물을 거슬러 올라가고 있습니다. 그들을 닫은 후). 문제는 드라이버 나 문서 중 하나입니다. 예제 코드는 실행할 때 동일한 문제가 있기 때문에.하스켈, MongoDB 드라이버, >> = 및 << =

나는 MongoDB와 함께 사용하는 관점에서 하스켈을 평가하려고하고있다. 이 드라이버 페이지의 예제를 사용하여 데이터베이스에 간단한 작업을 수행하는 간단한 프로그램을 작성하려고 시도했습니다 https://github.com/TonyGen/mongoDB-haskell. 나는 연결을 열고 심지어 데이터베이스에 삽입을 할 수 있습니다 (나는 DB를 체크했는데, 모든 것이 내부를 만든다). 제가 접속하고있는 문제는 일단 연결을 열고 뭔가를하면, 하스켈 프로그램이 인터프리터에게 "돌아와서"어떤 가치를 인쇄하거나 다른 것을 할 수 없다는 것입니다. 이것은 잘못된 단어 일지 모르지만 프로그램이 본질적으로 "잠겨"있다고 생각합니다.

잘 모르겠지만 "do"표기법에서 올바르게 끝내지 않는다고 생각합니다. 따라서 그냥 앉아 있다고 생각합니다. 드라이버 페이지의 예제를 보면 >> = 및 < < =과 같은 연산자를 사용하고 있음을 알 수 있습니다. 나는 "do"에서 끝내기 위해이 연산자들 중 하나 또는 둘 모두를 필요로하거나, 내가하고있는 일을 어떻게 든 끝내야한다는 것을 확신하지 못한다.

필자는 필요로하는 연산자 또는 연산자에 대한 명확한 예제와이를 사용하여 "do"를 완료하고 인터프리터로 돌아갈 수있는 방법을 알고 싶습니다. "finished"또는 어떤 값을 반환 할 수도 있습니다. 설명은 매우 기초적이고 실용적이며 평범한 말로 이루어져야하며, 사실에 관한 용어는 거의 순박하거나 어릴 적으로 말해야합니다. 설명은 그것이하는 일을하는 방식, 왜하는 일을하는 이유, 또는이 운영자 또는 운영자 내부에서 일어나는 일에 초점을 맞추어서는 안됩니다. 그것은 단지 "그런 것들"을하기 위해 그것을 사용하는 방법이어야합니다.

(명령이 보는 방법, 그것은 지시 무엇을 잘못 올바른) 예 :

"는 거꾸로 (<<=)를 화살표처럼 보이는 그 일을보기를 그라고 년대 '뒤로 연산자를 화살표 . ' do에서 실행을 중단하고 싶을 때마다 모나드 세계에서 순수한 하스켈의 세계로 정보를 다시 찍고 싶을 때 우리는 그 연산자를 사용합니다. 어떻게 작동합니까? 쏘고 싶습니다. 다시 오른쪽에. 왼쪽, 당신 스틱 .... "에

내가 모나드가 무엇인지의 설명을하지 않으려는, 모나드를 사용하는 방법, 어떤 모나드 내부에 간다 , 모나드가 어떻게 작동하는지, 등등. 저는 여러 번 문학과상의했습니다.

또한 >> = 또는 < < =과 같은 연산자 또는 작동 방식, 수행중인 작업 등을 설명하고 싶지 않습니다. 필요한 경우 사용 방법에 대한 설명을 원합니다. , 단지 이론적 인 (또는 다른) 것들은 아닙니다.

나는이 웹 사이트 및 다른 문서를 이미 스캔했지만 원하는 형식 (위 설명 참조)으로 찾을 수 없습니다.

예제 코드

{-# LANGUAGE OverloadedStrings, ExtendedDefaultRules #-} 

import Database.MongoDB 
import Control.Monad.Trans (liftIO) 

main = do 
    pipe <- runIOE $ connect (host "127.0.0.1") 
    e <- access pipe master "test" run 
    close pipe 
    print e 

run = do 
    test_insert 
    -- missing something here? tried return "finished" and other things 

test_insert = insertMany "blah" [ stuff... ] 

답변

3

그래서, 요청이 bind operator (>>=) 설명하는 것입니다 - 모나드로받지 않고 - Moand 클래스의 중앙 작업을. 왜, 나는 도전을 좋아하지 않습니다.

>>으로 시작하면 다른 언어로 된 세미콜론처럼 작동합니다. 그것은 한 줄에 두 액션을 붙이게합니다. 이것은 거짓말이지만 진리를 대면하고 싶지 않습니다. (진리는 행동과 기능의 차이점을 이해하는 것을 포함합니다.) 액션의 결과를 사용해야 할 경우 어떻게됩니까? >>= 연산자는 한 동작의 결과를 가져 와서 다음 동작의 인수로 제공합니다 (= < <는 동일한 작업을 거꾸로 수행합니다).

그래서, allTeams >>= printDocs "All Teams"

do 
    teams <- allTeams 
    printDocs "All Teams" teams 

그리고, allTeams = rest =<< find (select [] "team") {sort = ["home.city" =: 1]}

allTeams = do 
    cursor <- find (select [] "team") {sort = ["home.city" =: 1]}` 
    rest cursor 

사실과 동일합니다, 당신은 >>= 방정식의 집합 및 >>= 방정식의 집합으로에 어떤 do 블록을 변환 할 수 있습니다 블록 기계적으로 do. 이 시점에서


는, 당신은 정말 행동도과와 같은 복잡한 구문에 대한 필요성이 정말 무능한 유형 오류로 실행 이유에 대해 혼동한다. 당신이이 일에 너무 좌절하게되면 나는 두 가지 선택을하기 전에 다음과 같이 두 가지 선택을 할 것입니다.

    왜 haskell이 명령형 언어와 다른지에 대해 조금은 알고 있어야한다는 것을 인정하십시오. 동작과 사이의 차이점을 이해해야합니다.
  1. haskell이 당신을 제공하고 Prolog에서 코딩으로 돌아갈 것이 없다는 것을 결정하십시오.

옵션 1을 선택 하시겠습니까? Here is where you need to start.


업데이트 디버깅

그래서 우리가 알고있는 것은 insertMany 조치가 데이터베이스에 접속한다는 것입니다. 실제로 돌아 왔습니까? 나는 access이 MongoDB가 데이터가 쓰여지는 것을 확인하면서 돌아올 때까지 기다릴 것이라는 것을 의미하는 액세스 모드 인 master을 사용하고 있음을 주목합니다.

또한 close pipe 동작이 있습니다. 이것은 이론적으로 막을 수 있습니다.이에게 저렴한 방법을하고 그냥 인쇄 문을 추가 할 수 있습니다 : 당신이 경우 우리가

Start -- 
before insert 
^C -- we got stuck here 

을 볼 수 무엇을 설명에서

main = do 
    putStrLn "Start --" 
    pipe <- runIOE $ connect (host "127.0.0.1") 
    e <- access pipe master "test" run 
    liftIO $ putStrLn "before close pipe" 
    close pipe 
    print e 
    putStrLn "\n Finished" 

run = do 
    liftIO $ putStrLn "before insert" 
    test_insert 
    liftIO $ putStrLn "after insert" 

test_insert = insertMany "blah" [ stuff... ] 

을, 나는 볼 필요가있을 것이다 stuff...

프로그램을 통해 더 멀리 벗어나면 (내 직감은 "삽입 후"가 아니라 "닫기 파이프"전에 표시됨), 그러면 haskell이 Mongo와 올바르게 통신하는지 여부를 알아야합니다. 삽입물을 올바르게 기록 했더라도 파이프는 계속 오지 않는 동기화 이벤트를 기다리는 동안 "대기 중"상태 일 수 있습니다.

그러면 우리는 haskell을 잘못 사용하는 것이 아니라 MongoDB 라이브러리를 잘못 사용했다는 것을 믿을 수 있으며이를 염두에두고 다른 SO 질문을 할 수 있습니다.

+0

@ JohnFMiller, 다른 사람들이 사용하는 언어에 대한 가정에주의해야합니다. 필자는 Python을 사용한 적이 한번도 없었으며 Erlang, Prolog, APL, J 등의 언어에서 많이 사용합니다. 그 외에도 귀하의 게시물에는 아무런 문제가 없으며 귀하가해야 할 말을 연구 할 것입니다. – user1992634

+0

데이터베이스 항목을 (성공적으로) 수행 한 후에도 "반환"할 수 없습니다. 다른 조언? – user1992634

+0

위의 대답에서 업데이트를 참조하십시오. –

관련 문제