所以我在haskell中尝试了以下代码,我尝试检测用户是否在字符串中输入了“no”或“No”。我也尝试用字符串替换[[Char]],但它会出现编译错误。
wantGifts :: [[Char]] -> [[Char]]
wantGifts st = [if (x == "No" || x== "no") then "No gifts given" else "But why" | x <- st, x == head st]
上面的代码编译但是当我向它传递一个字符串时,它会返回一条错误消息:
*Main> wantGifts "no I dont"
<interactive>:8:11:
Couldn't match type ‘Char’ with ‘[Char]’
Expected type: [[Char]]
Actual type: [Char]
In the first argument of ‘wantGifts’, namely ‘"no I dont"’
In the expression: wantGifts "no I dont"
In an equation for ‘it’: it = wantGifts "no I dont"
答案 0 :(得分:2)
仔细查看wantGifts
的类型,它需要一个列表列表。但"no I dont"
的类型为String
,只有[Char]
。根据您当前的构造,您必须使用:
wantGifts ["no I dont"]
有几种方法可以改善这一点,最好是使用Text
。
import Data.Text (Text)
import qualified Data.Text as T
wantGifts :: Text -> Text
wantGifts txt = if (T.isInfixOf "no" . T.toLower) txt then "No gifts given" else "But why"
答案 1 :(得分:2)
您已将wantGifts
定义为获取字符串列表。 [[Char]]
相当于[String]
。在REPL中,您传递的是一个字符串。
如果您改为这样做,它会编译:
wantGifts ["no I dont"]
然而,我有预感,这不是你想要的。
如果您尝试检测单词"no"
是否在字符串中的任何位置,则可以使用words
函数:
containsNo :: String -> Bool
containsNo = any (\w -> w == "no" || w == "No") . words