1

要素リストが 1 つあるケースを見逃していると思いますが、それを書く方法が見つかりません。誰か助けてもらえますか?

getBoard :: [String] -> [String]
getBoard (h:t) | isLOL h = h: getBoard (t)
               | otherwise = []


isLOL :: String -> Bool
isLOL [ ] = True
isLOL (h:t) | h>='a' && h<='z' || h >='A' && h<='Z' = isLOL t
            | otherwise = False
4

2 に答える 2

1
getBoard [] = []

ご希望のラインです。このような:

getBoard :: [String] -> [String]
getBoard [] = []
getBoard (h:t) | isLOL h = h: getBoard (t)
               | otherwise = []


isLOL :: String -> Bool
isLOL [] = True
isLOL (h:t) | h>='a' && h<='z' || h >='A' && h<='Z' = isLOL t
            | otherwise = False
于 2014-11-18T16:20:49.170 に答える
1

まず第一に、あなたの定義では、問題はパターン(あなたの場合)が一致したgetBoard後にガード(の後のもの)がチェックされることです。そのため、 への引数が一致しない(つまり である) 場合、2 つのブランチ (ブランチを含む) はチェックされません。これに対する解決策は、に一致を追加することです:|h:tgetBoardh:t[]otherwise[]

getBoard (h:t) | isLOL h = h : getBoard t
               | otherwise = []
getBoard [] = []

ただし、失敗したガードとの一致は失敗するため、次のように記述できます。

getBoard (h:t) | isLOL h = h : getBoard t
getBoard _               = []

さて、プレリュードの再帰スキームを使用して、この関数をより良い方法で記述する方法については、次のとおりです。

isLOLとして書き換えることができます

isLOL = all $ \h -> 'a' <= h && h <= 'z' || 'A' <= h && h<= 'Z'

すべての文字の場合は常に元のリストを返し、それ以外の場合は空のリストをgetBoard返すことに注意してください。isLOL

getBoard cs | all isLOL cs = cs
            | otherwise = []
于 2014-11-18T16:22:57.373 に答える