在Haskell中的函数中传递字符串时出错

时间:2017-02-14 17:57:59

标签: list function haskell char

所以我在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"

2 个答案:

答案 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