我想撰寫一個函式search :: String -> Char -> [Int],該函式回傳第一個引數中所有出現的第二個引數的位置。例如:
search "Bookshop" 'o' == [1,2,6]
search "senselessness" 's' == [0,3,7,8,11,12]
根據@Will Ness,最終代碼如下:
search :: (Num b, Eq a, Enum b) => [a] -> a -> [b]
search s char = [ i | (i,c) <- zip [0..] s, c==char]
我想做一個帶有搜索屬性的 QuickCheck 測驗,即輸出的元素不能多于第一個引數。將如何實作這一目標?我的骨架代碼如下:
prop_search :: String -> Int -> Int -> Bool
prop_search x char = if length search x char <= length x then True else False
這會產生一個匹配錯誤,其中:
* Couldn't match expected type `Int -> Bool'
with actual type `Bool'
* In the expression: False
為什么會這樣?
uj5u.com熱心網友回復:
有幾個問題prop_search。雖然 Haskell 中的編譯器訊息可能有點令人生畏,但第一個故障排除技巧是意識到(除非您使用該語言的一些高級擴展)型別注釋是多余的。編譯器不需要型別注釋,但最好包含它們,因為它有助于提高可讀性。
因此,首先嘗試查看運算式本身是否可以編譯。在這里,我只是使用 GHCi:
Prelude> prop_search x char = if length search x char <= length x then True else False
<interactive>:18:25: error:
* Couldn't match expected type `t a -> t1 -> Int'
with actual type `Int'
* The function `length' is applied to three arguments,
but its type `([()] -> () -> [Integer]) -> Int' has only one
In the first argument of `(<=)', namely `length search x char'
In the expression: length search x char <= length x
* Relevant bindings include
char :: t1 (bound at <interactive>:18:15)
x :: t a (bound at <interactive>:18:13)
prop_search :: t a -> t1 -> Bool (bound at <interactive>:18:1)
所以這是行不通的,但這是另一個錯誤而不是 OP 中發布的錯誤。它說什么?
函式“length”應用于三個引數
是什么型別的length?
Prelude> :t length
length :: Foldable t => t a -> Int
length是一個函式,它接受一個Foldable引數并回傳一個Int. 它需要一個而不是三個引數。
length search x char然而,在運算式中,它看起來好像length是用三個引數呼叫Haskell 編譯器。
相反,您想要測量lengthof search x char,因此將其分組:
prop_search x char = if length (search x char) <= length x then True else False
現在編譯,這意味著你可以查詢它的型別:
Prelude> :t prop_search
prop_search :: Eq a => [a] -> a -> Bool
請注意,這不是 OP 中給出的型別。該函式需要兩個引數 - 而不是三個。
如果需要,您可以復制該推斷型別并將其作為型別注釋添加到函式中。
最后,無論何時你發現自己在寫if x then True else False,你可以寫x:
prop_search x char = length (search x char) <= length x
這仍然具有相同的型別:
Prelude> :t prop_search
prop_search :: Eq a => [a] -> a -> Bool
總之,您可能希望這樣撰寫函式:
prop_search :: Eq a => [a] -> a -> Bool
prop_search x char = length (search x char) <= length x
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/316852.html
上一篇:為什么這個型別定義是非法的?
