2017-03-23 11 views
1

私持ってStringがより短い4つの文字であればNothingを返し、次のHaskellの機能:ハスケル:テストであればリストの長さ<4

stringToMove :: String -> Maybe Move 
    stringToMove [] = Nothing 
    stringToMove [a] = Nothing 
    stringToMove [a, b] = Nothing 
    stringToMove [a, b, c] = Nothing 
    stringToMove (l1:n1:l2:n2:rest) = Just (stringToCoords l1 n1, stringToCoords l2 n2) 

私はlength stringでテストが、可能性としてこれまで私は、これを読んでStringが長ければ、すべてが評価されるからです。

各行にNothingを繰り返さなくても、これを書くための洗練された方法がありますか?

+0

あなたがチェックしたいだけで、バインディングを気にしない場合は、 'nullもあります。ドロップ3 '。 –

答えて

9
stringToMove :: String -> Maybe Move 
    stringToMove (l1:n1:l2:n2:rest) = Just (stringToCoords l1 n1, stringToCoords l2 n2) 
    stringToMove _ = Nothing 
4

私はちょうどあなたがこのようなチェックの多くを持っていて、Maybeを返すようにしたい場合は、あなたがdo表記を使用することができ、中に鳴るように感じる:

stringToMove :: String -> Maybe Move 
stringToMove s = do 
    l1:n1:l2:n2:_ <- return s 
    return (stringToCoords l1 n1, stringToCoords l2 n2) 

あなたにfailableバインディングを行うことができますあなたが何度も好きなように何度も失敗すると、関数はNothingを返します。

+0

あなたのソリューションは素晴らしいですが、私はそれを使用するつもりですが、これは一般的なケースに入る方法なので、他の答えを受け入れる必要があります –

+2

私は本当にここで意図的に非効率的な 'fail'の暗黙的な使用を嫌っていますパターンマッチ。 'foo < - return bar' *は冗長であるように見えますが、' let'で置き換えるべきですが、実際にそこに隠されているエラーチェックがあります。 – amalloy

+1

@amalloyまあ、それはこの答えについて賢いですね。しかし、私は、おそらく '< - return s'の代わりに明示的な' < - Just s'を書く方がはっきりしていることに同意します。依然として多態性を保つために、 '' - 純粋な ''もオプションになります。これは '' return''と完全に同じですが、ここではモナド・ローの忘れが忘れられているわけではありません。 – leftaroundabout

関連する問題