2016-04-06 18 views
3
readSquareTransition :: String -> Maybe [SquareTurn] 
readSquareTransition [] = Just [] 
readSquareTransition (x:xs) = case x of 
     'L' -> Just (L : readSquareTransition xs) 
     'R' -> Just (R : readSquareTransition xs) 
     _  -> Nothing 

私はちょうど[L、L、R、R]になりたいです。私は失敗したように:(ここでエラーメッセージがあるけどね!このハスケルの文字列リストへ

'L' -> fmap (L :) $ readSquareTransition xs 
'R' -> fmap (R :) $ readSquareTransition xs 

src/StudentSources/LangtonsAnt.hs:231:24: 
Couldn't match expected type ‘[SquareTurn]’ 
      with actual type ‘Maybe [SquareTurn]’ 
In the second argument of ‘(:)’, namely ‘readSquareTransition xs’ 
In the first argument of ‘Just’, namely 
    ‘(L : readSquareTransition xs)’ 

src/StudentSources/LangtonsAnt.hs:232:24: 
Couldn't match expected type ‘[SquareTurn]’ 
      with actual type ‘Maybe [SquareTurn]’ 
In the second argument of ‘(:)’, namely ‘readSquareTransition xs’ 
In the first argument of ‘Just’, namely 
    ‘(R : readSquareTransition xs)’ 

答えて

3

モジュラー方法は、(故障の可能性を有する)単一SquareTurnCharを有効にする方法を定義するreadSquareTurn最初に定義することである:次いで

readSquareTurn :: Char -> Maybe SquareTurn 
readSquareTurn x = case x of 
    'L' -> Just L 
    'R' -> Just R 
    _ -> Nothing 

全体を処理するmapM :: (a -> Maybe b) -> [a] -> Maybe [b]を使用しますStringのように:

3

変更この

'L' -> Just (L : readSquareTransition xs) 
'R' -> Just (R : readSquareTransition xs) 

問題はreadSquareTransitionがMaybe [SquareTurn]を返すので、あなたができることです(:)を適用してください((:)にはリストが必要です)。fmapしかし、Just (保存中はNothing)。これを行うの

+0

あなたは 'Just'を削除する必要があります:' readSquareTransition'は既に何かを返します。 – gallais

+0

おっと、私は不注意でした、あなたは正しいです、私はこれを変更します.... – jamshidh

+1

'readSquareTransition xs'や' $ 'の前にカッコを付けたり、'(<$>) 'の代わりに'fmap'。 – gallais