fromJust不会转换int值

时间:2019-05-02 10:19:47

标签: haskell

从我的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转换为整数

1 个答案:

答案 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