从我的putCursorTo函数调用findWord函数,该函数返回Maybe Int值。它由fromJust处理,以存储索引值。为什么会引发签名错误?
我尝试为putCursorTo添加一个Int输入签名,但这不是错误
putCursorTo :: String -> [String] -> [String]
putCursorTo word t = do
index <- [fromJust (findWord word t)]
let (x,y) = splitAt index t
init x ++ [last x ++ "^"] ++ y
findWord :: [String] -> Maybe Int
findWord t = find t 0
where
find [] _ = Nothing
find (x:xs) c
| "^" `isInfixOf` x = Just c
| otherwise = find xs (c+1)
我遇到的错误是在index <- [fromJust (findWord word t)]
行上,告诉我fromJust变量不在范围内。
我想使其正常工作,以便索引值存储findWord函数的值,该函数使用fromJust转换为整数
答案 0 :(得分:3)
使用Maybe
的目的是迫使findWord
的用户考虑findWord
可能失败的可能性。 fromJust
忽略了这种可能性。对putCursorTo
的更好定义是
putCursorTo :: String -> [String] -> Maybe [String]
putCursorTo word t = do
index <- findWord word t
let (x,y) = splitAt index t
return $ init x ++ [last x ++ "^"] ++ y
在这里,我们尝试从Int
的结果中提取findWord
。如果成功,我们可以照常进行,除了将最终结果提升回Maybe
值。如果提取{em>不成功,因为findWord
返回了Nothing
,那么putCursorTo
也将返回Nothing
(根据{{ 1}} monad。
另一种选择是在Maybe
失败时记住一些默认索引。我们可以使用findWord
函数来提供它:
fromMaybe
如果找不到putCursorTo :: String -> [String] -> [String]
putCursorTo word t = let (x,y) = splitAt (fromMaybe 0 (findWord word t)) t
in init x ++ [last x ++ "^"] ++ y
,请用有意义的索引替换0。或者,如果word
失败,您可以按原样返回原始列表:
findWord
所有这些,putCursorTo :: String -> [String] -> [String]
putCursorTo word t = case findWord word t of
Nothing -> t
Just index -> let (x, y) = splitAt index t
in init x ++ [last x ++ "^"] ++ y
的定义与您如何称呼它之间是不匹配的。也许呼叫应该是findWord
而不是findWord t
。