我根本无法使用此方法。一直出错。我哪里弄错了?它应该接受字符串数组,取头,创建一个点。但是,我认为问题出在递归调用中。
data Point = Point(Int, Int) -- y, x
instance Show Point where
show (Point(y, x)) = "(" ++ show x ++ "," ++ show y ++ ")"
gimmePoints :: String -> Point
gimmePoints (x:xs) = do Point(1,2)
gimmePoints xs
答案 0 :(得分:3)
如果你的函数有签名... -> Point
,那意味着结果应该是一个点。没有其他的。所以你当然可以写
gimmePoints :: String -> Point
gimmePoints (x:xs) = Point(1,2)
这意味着只会处理字符串中的第一个字符。实际上,由于你实际上并没有以任何方式使用字符串或字符串中的任何其他内容,所以你可以将其写为
gimmePoints _ = Point(1,2)
我认为这不是你想要的。
无论如何, do
语法在这里没有任何意义,即 monadic (“side-effectiveful”) actions 。例如,如果您希望每个角色都要打印到屏幕上,那么您可以
gimmePoints' (_:xs) = do
print $ Point(1,2)
gimmePoints' xs
在这种情况下,gimmePoints
的结果根本不是Point
,而是没有结果的IO操作(因为“结果”会被发送到屏幕上)
gimmePoints' :: String -> IO ()
您可能真正想要的更合理,或至少更多功能性编程版本
gimmePoints'' :: String -> [Point]
gimmePoints'' [] = []
gimmePoints'' (_:xs) = Point (1,2) : gimmePoints'' xs
即。对于字符串中的每个字符,在结果中产生一个点。这实际上最好写成
gimmePoints'' = map (const $ Point (1,2))