2014-11-30 5 views
0

if/then/else 블록이 컴파일러에서 설정되지 않았기 때문에 컴파일하지 않은 코드 블록이 있습니다. 그러나 이해할 수 있도록 다시 작성하는 방법을 알아낼 수는 없습니다. 목록이 비어있는 경우 if/then/else in do 문 (Haskell)

playRandomly board = do 
       let vMoves = getValidMoves board board 
       if vMoves == [] then return [] else 
       rMove <- uniform vMoves 
       let Just nBoard = runMove board rMove 
       rest <- playRandomly nBoard 
       return (rMove : rest) 

은 기본적으로 기능 uniform은 0으로 나누는 것, 그래서 나는이를 잡아와 DO 문에 수행하기 전에 빈 목록을 반환하는 방법이 필요합니다. 어떤 충고?

+0

그냥 재미로, 나는 [여기] (http://lpaste.net/115385) 대체 restyling 붙여 넣습니다. 이것을 대답으로 두지 않기 때문에, 실제로 "들여 쓰기가이 작업을하게 만드는"질문에 실제로 대답하지 않기 때문입니다. –

답변

2

당신은 당신이에게 여러 번 할 경우, 코드가 외부 계단 및 읽을 될 것이라고, 그러나, 당신을 경고 할 새로운 do

playRandomly board = do 
      let vMoves = getValidMoves board board 
      if vMoves == [] 
       then return [] 
       else do 
       rMove <- uniform vMoves 
       let Just nBoard = runMove board rMove 
       rest <- playRandomly nBoard 
       return (rMove : rest) 

의 나머지 명령을 포장 할 수 있습니다. 이를 해결하기 위해 함수를 분리하거나 오류 검사를 위해 모나드를 사용할 수 있습니다.

+0

그건 고마워. 고마워. 그것을 분할하는 것에 대해 생각해 봤지만, 어쨌든 당신이 제공 한 것처럼 쉬운 인라인 솔루션이 될 것이라고 기대했던 그런 작은 함수였습니다. –