我试图编写一个返回String
中第一个数字的函数,如果没有,那么该函数应返回1
。
示例:
firstNumber "Example456"
应返回4
,因为这是String
中的第一个数字。
firstNumber "Example"
应返回1
,因为没有数字。
这是我到目前为止所做的:
firstNumber :: String -> Int
firstNumber = read . maximumBy (length) . map (isDigit)
有人可以帮我吗?
答案 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
中的默认值/类型更改为其他内容。