题解 P5660 【数字游戏】
HoshinoTented
2019-11-23 17:45:10
简单的入门题
题目要求是求出一段字符串中字符 1 的个数,那可以写出这样的代码:
```haskell
oneCount :: String -> Int
oneCount "" = 0
oneCount ('1':xs) = 1 + oneCount xs
oneCount (_:xs) = oneCount xs
```
但是想一想,Haskell 可是函数式语言,应该用函数式的方法解决问题,于是把眼光转到 `filter` 函数:
```haskell
filter :: (a -> Bool) -> [a] -> [a]
```
根据传入的判断函数过滤出需要的内容,而我们需要的内容就是字符 '1',于是:
```haskell
oneCount :: String -> Int
oneCount str = length (filter (=='1') str)
```
补全 main 函数:
```haskell
main :: IO ()
main = do
str <- getLine
print (oneCount str)
```
内联:
```haskell
main :: IO ()
main = do
str <- getLine
print (length (filter (=='1') str))
```
Point-Free:
```haskell
main = getLine >>= print . length . filter (=='1')
```
最后,一行解决
~~垃圾 C++ 能一行吗?能这么简洁吗?~~