从String返回第一个数字的函数

时间:2014-03-15 21:53:41

标签: haskell

我试图编写一个返回String中第一个数字的函数,如果没有,那么该函数应返回1

示例:

firstNumber "Example456"应返回4,因为这是String中的第一个数字。

firstNumber "Example"应返回1,因为没有数字。

这是我到目前为止所做的:

firstNumber :: String -> Int
firstNumber = read . maximumBy (length) . map (isDigit)

有人可以帮我吗?

2 个答案:

答案 0 :(得分:5)

如果找不到数字,则返回1并不是很好,如果字符串包含数字1并且那是第一个怎么办?相反,您可以使用Maybe数据类型来表示使用Nothing的失败计算或带有Just的有效返回值。

您可以执行类似

的操作
firstNumber :: String -> Maybe Int
firstNumber s = fmap digitToInt $ listToMaybe $ filter isDigit

但您需要Data.Maybe导入才能获得listToMaybe。然后你可以用它作为

> firstNumber "example"
Nothing
> firstNumber "example456"
Just 4

如果您确实想要在失败的搜索中返回1,那么您可以执行

firstNumberOr1 :: String -> Int
firstNumberOr1 = fromMaybe 1 . firstNumber

fromMaybe函数具有定义

fromMaybe :: a -> Maybe a -> a
fromMaybe default Nothing = default
fromMaybe default (Just a) = a

所以fromMaybe 1在给定1时会返回Nothing,如果给出Just,则只需展开{{1}}中的任何值。

答案 1 :(得分:2)

你可以这样做:

headDef [] = 1
headDef (x:_) = read [x]
firstNumber = headDef. filter isDigit

s="Example456"

输出:

*Main> firstNumber s
4
*Main> firstNumber "ex"
1
*Main>  

函数headDef尝试检索列表的第一个元素,并在列表为空时将其替换为默认值。如有必要,您可以将headDef中的默认值/类型更改为其他内容。