putStrLn (split x >>= (\(a,b) -> a ++ " " ++ b))
一元绑定运算符>>= 有签名
(>>=) :: Monad m => m a -> (a -> m b) -> m b
或者,在您的具体情况下,
(>>=) :: Either e a -> (a -> Either e b) -> Either e b
所以我们使用>>=,当我们有一个Either 并且想要将其中的东西传递给一个本身返回Either 的函数时。但是你的函数是\(a,b) -> a ++ " " ++ b),它不会返回Either。您要做的是获取Either 并将函数应用到内部,而单独留下Either 部分。这是对Functor 类型类中的fmap 的使用。
fmap :: Functor f => (a -> b) -> f a -> f b
-- Specifically
fmap :: (a -> b) -> Either e a -> Either e b
所以你想要
fmap (\(a,b) -> a ++ " " ++ b) $ split x
这将返回一个Either String String。 putStrLn 可以打印字符串。如果我们要打印Either,那么你需要使用print。
print (fmap (\(a,b) -> a ++ " " ++ b) $ split x)
另一方面,我们可以对结果进行模式匹配,并在 Left 情况下做一些不同的事情。
case fmap (\(a,b) -> a ++ " " ++ b) $ split x of
Left e -> undefined -- Error case
Right s -> putStrLn s