使用Haskell接受字符串并删除重复的字符

xen*_*ato 0 haskell

我正在新学习Haskell,并且在之前提出的类似问题的帮助下,我达到了以下代码,但是我收到了一个错误 -

Couldn't match type ' [ ] ' with ' IO '.
Expected type - IO Char
Actual type - [Char]
Run Code Online (Sandbox Code Playgroud)
import Data.Set

removeDups :: Ord a => [a] -> Set a -> [a]
removeDups [] sofar = []
removeDups (x:rest) sofar
     | member x sofar = (removeDups rest sofar)
     | otherwise      = x:(removeDups rest (insert x sofar))
main = do
  name <- getLine
  removeDups name empty
Run Code Online (Sandbox Code Playgroud)

bhe*_*ilr 5

这里的问题是removeDups返回类型[a],但是当你在do块中调用一个函数时,它必须匹配该块的monadic类型do.在这种情况下,你在里面调用它main,它必须有类型IO (),所以编译器期望removeDups有类似的返回类型IO a,但它实际上是返回类型Ord a => [a].你可以改为做点什么

main = do
    name <- getLine
    let unique = removeDups name empty
    print unique
Run Code Online (Sandbox Code Playgroud)

既然print有返回类型IO ().