gpt4 book ai didi

string - Haskell:整数解析的优雅解决方案

转载 作者:行者123 更新时间:2023-12-04 05:04:44 25 4
gpt4 key购买 nike

我想编写一个函数来获取字符串中的第一个整数,前提是该整数位于字符串的开头并且后跟空格或什么都没有。

例如,“12”和“12 kids”是有效字符串,但“12kids”和“a12”是无效字符串。

这是我的功能:

getFirstInteger :: String -> Int
getFirstInteger [] = error "No integer"
getFirstInteger str
| dropWhile (Char.isNumber) str == [] = read str :: Int
| Char.isSpace $ head $ dropWhile (Char.isNumber) str = read (takeWhile (Char.isNumber) str) :: Int
| otherwise = error "No integer found"

问题在于,如果字符串实际上是一个整数,head 将引发异常,因此这就是第一个条件存在的原因。这个问题有什么优雅的解决方案吗?

最佳答案

getFirstInteger :: String -> Int
getFirstInteger = read . head . words

words 会将 String 拆分为 Strings 的列表,这些字符串最初由空格分隔。 head 将取第一个(如果原始字符串为空,则为 error),read 将像往常一样解析字符串(和 错误 如果第一个单词不是有效的 Int)。

但是,我更喜欢在空 String 或不可解析的字符串上不使用 error 的变体,例如

import Text.Read (readMaybe)

getFirstInteger :: String -> Maybe Int
getFirstInteger [] = Nothing
getFirstInteger xs = readMaybe . head . words $ xs

可以使用 Data.Maybe 中的 listToMaybe 完全无意义地编写此代码,但这可能有点矫枉过正:

import Data.Maybe (listToMaybe)
import Text.Read (readMaybe)
import Control.Monad ((>=>))

getFirstInteger :: String -> Maybe Int
getFirstInteger = listToMaybe . words >=> readMaybe

关于string - Haskell:整数解析的优雅解决方案,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37147458/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com