我正在嘗試撰寫一個函式,其中運算式:
crosswordFind letter inPosition len words
應回傳的所有專案從words哪個
- (i) 具有給定的長度
len并且 - (ii)
letter在該職位上inPosition。
例如,具有’k’in position 的七個字母的單詞,1運算式:
crosswordFind ’k’ 1 7 ["funky", "fabulous", "kite", "icky", "ukelele"]
將回傳
["ukelele"]
這是我到目前為止所擁有的:
crosswordFind :: Char -> Int -> Int -> [String] -> [String]
crosswordFind letter pos len words =
if isAlpha **words** == letter &&
**words** !! letter == pos &&
length **pos** == len
then words
else []
上面的代碼是在更改洗掉我放置以分隔每個條件的括號之后。下面的代碼是原始代碼(這是錯誤的):
crosswordFind :: Char -> Int -> Int -> [String] -> [String]
crosswordFind letter pos len words =
[ if [isAlpha x == letter] &&
[xs !! n == pos] &&
[length x == len]
then words
else [] ]
我明白為什么它是錯誤的(因為將回傳長度為 1 的串列),但是為什么不能使用像這樣的括號來分割 Haskell 中的代碼?
如何使用串列推導式解決這個問題?而且我想知道用什么來替換粗體字以及使代碼正常運行。
uj5u.com熱心網友回復:
您可以filter使用滿足兩個條件的條件:
- 單詞具有給定的長度;和
- 位置上的字符
pos是給定的letter。
對于一個單詞w,words我們因此檢查 iflength w == len和w !! pos == letter。
因此,我們可以通過以下方式實作:
crosswordFind :: Eq a => a -> Int -> Int -> [[a]] -> [[a]]
crosswordFind letter pos len words = filter (\w -> length w == len && w !! pos == letter) words
我們也可以省略words變數并使用:
crosswordFind :: Eq a => a -> Int -> Int -> [[a]] -> [[a]]
crosswordFind letter pos len = filter (\w -> length w == len && w !! pos == letter)
上面的不是很安全:如果pos大于或等于長度,那么w !! pos == letter會引發錯誤。此外,對于無限字串(Chars 的串列),length將永遠回圈。我把它作為一個練習來介紹更安全的變體。您可以使用遞回函式確定這些。
uj5u.com熱心網友回復:
方括號是串列語法的一部分。沒有其他的。
串列。
您可以自由使用圓括弧( )用于運算式的分組。
一些運算式型別,如letand do,有自己的分隔符{, ;, },也可以使用,特別是為了防止空白脆弱。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/316857.html
上一篇:每次使用zip和length函式時,如何從一串字母中回傳字母的每個位置?
下一篇:努力實作定時器
