2017-02-12 6 views
0

안에 나는 랜드 - 모나드 내부 runST을하고 싶지,하지만 난 오른쪽 종류를 얻을 수 GHC의 출력은 특히 도움이되지 않습니다 : 입력에runST는 MonadRandom

import   Control.Monad 
import   Control.Monad.Random as MR 
import   Control.Monad.ST 
import   Control.Monad.Trans 
import qualified Data.Vector.Unboxed as VU 

shuffle :: (MonadRandom m) => m (VU.Vector Int) 
shuffle = do 
    k <- getRandomR (0::Int, 10::Int) 
    let vec = runST $ do 
    vector <- VU.unsafeThaw (VU.enumFromN (1::Int) k) 
    vector' <- VU.unsafeFreeze vector 
    return vector 
    return vec 

구문 분석 오류 ' 벡터 '

답변

2

이 오류는 주로 들여 쓰기 문제와 관련이 있습니다. runST 블록의 줄을 조금 더 들여 쓰면 그 오류는 사라집니다.

다음 문제는 잘못된 벡터를 반환한다는 것입니다 ('을 잊었습니다).

마지막으로 다음 줄의 return 함수와 함께 값을 바인딩하는 것은 중복됩니다. 또한

shuffle :: (MonadRandom m) => m (VU.Vector Int) 
shuffle = do 
    k <- getRandomR (0::Int, 10::Int) 
    let vec = runST $ do 
       vector <- VU.unsafeThaw (VU.enumFromN (1::Int) k) 
       VU.unsafeFreeze vector 
    return vec 

,

shuffle :: (MonadRandom m) => m (VU.Vector Int) 
shuffle = do 
    k <- getRandomR (0::Int, 10::Int) 
    return $ runST $ do 
    vector <- VU.unsafeThaw (VU.enumFromN (1::Int) k) 
    VU.unsafeFreeze vector 
+0

우수 : 여기

코드를 노력하고 있습니다. 이중 공백 들여 쓰기 탭은 놓치기 쉽습니다. 어떻게 runST를 무작위 모나드로 옮길 필요가 없습니까? 돌려 주겠니? – tsorn

+1

'runST'는 순수한 값 (이 경우 당신의 벡터)를 반환하고,'return'은 값을 모나드에 "넣습니다". – Erik

+0

또는'do'를 잊어 버리십시오. 왜냐하면'do'는 임시 벡터의 이름을 생성하게 만드는 것입니다.'return. runST $ VU.unsafeThaw (VU.enumFromN (1 :: Int) k) >> = VU.unsafeFreeze' – amalloy