在Haskell中实现FSharp的Int32.TryParse

Dra*_*gno 3 f# haskell

我喜欢F#中的Int32.TryParse函数,我想在Haskell中创建自己的函数:

import qualified Control.Exception as CE
handler:: CE.ErrorCall -> IO (Bool,Int)
handler e = return (False,0)
s2Int :: String->Int
s2Int s = read s
tryParse :: String -> IO (Bool,Int)
tryParse s = CE.catch (s2Int s `seq` return (True,read s)) handler
Run Code Online (Sandbox Code Playgroud)

解析Int的七行?!有更短的方式吗?

谢谢...

Lee*_*Lee 9

你可以使用reads:

tryParse :: String -> (Bool, Int)
tryParse s =
    case reads s of
        [(i, "")] -> (True, i)
        _ -> (False, 0)
Run Code Online (Sandbox Code Playgroud)

Maybe Int然而,返回a会更加个性化:

tryParse :: String -> Maybe Int
tryParse s =
    case reads s of
        [(i, "")] -> Just i
        _ -> Nothing
Run Code Online (Sandbox Code Playgroud)

  • 返回`(Bool,Int)`真的没有意义.在F#中这种方式的唯一原因是因为它是C#函数的语法糖,它采用可变的`int`并返回一个`bool`. (2认同)

Vek*_*weg 9

你可以使用readMaybeText.Read,并得到一个Maybe Int相反:

import Text.Read

tryParse :: String -> Maybe Int
tryParse = readMaybe
Run Code Online (Sandbox Code Playgroud)

  • 要走的路,`TryX`模式与`Maybe`太接近了. (2认同)