Haskell错误 - 无法将预期类型"Char"与实际类型"[Char]"匹配

Jac*_*son 0 string haskell char

我正在尝试编写一个Haskell函数,该函数将获取一个人的全名并仅返回姓氏; 例如,getName "Hans Christian Anderson"应该返回"Anderson".功能如下:

getname :: String -> String
getname fullName = do
  let nameList = splitOn " " fullName    -- split the full name into individual names
  let reversedName = reverse nameList    -- reverse the full name
  let lastName = reversedName !! 0       -- get the first name from the reversed list
  return lastName
Run Code Online (Sandbox Code Playgroud)

但每当我尝试编译它时,我会收到以下错误:

Couldn't match expected type ‘Char’ with actual type ‘[Char]’
In the first argument of ‘return’, namely ‘lastName’
In a stmt of a 'do' block: return lastName
Run Code Online (Sandbox Code Playgroud)

我不确定我完全理解这个错误.据我了解Haskell(我对它很新),结构[Char]将是相同的String,这正是我正在寻找的.我只是不明白为什么它期望这种Char类型似乎作为String出现在return语句中.我已经过了每一行,他们似乎对我来说是正确的.

关于为什么会出现这种行为以及如何解决这个问题的任何建议都非常感谢.

che*_*ner 5

不要do在这里使用符号.因为函数的返回值是[Char],所以参数to return应该是一个Char值(因为return :: a -> [a]).

你这里没有做任何需要do记谱法的事情; 只需使用常规函数调用.

getname fullName = (reverse (splitOn " " fullName)) !! 0
Run Code Online (Sandbox Code Playgroud)

  • 这就是"回归"的目的; 它的一般类型是`return :: Monad m => a - > ma`,但是`m`这里被固定为`[]`,因为`getname`的声明返回值.`return`函数与大多数编程语言中的同名语句完全不同 (2认同)