【发布时间】:2020-07-01 21:40:59
【问题描述】:
我正在研究 HackerRank 问题集。下面的 Haskell 正确地解决了这个问题,但我有一种预感,这不是一个经验丰富的老手会写的。对于如何使这个更漂亮/更具表现力的任何意见,我将不胜感激。
compTrips :: [Int] -> [Int] -> [Int]
compTrips as bs =
let oneIfGreater a b = if a > b
then 1
else 0
countGreater x y = foldr (+) 0 $ zipWith oneIfGreater x y
in [countGreater as bs, countGreater bs as]
main = do
line1 <- getLine
line2 <- getLine
let alice = map read $ words line1
let bob = map read $ words line2
let (a:b:_) = compTrips alice bob
putStrLn $ show a ++ " " ++ show b
【问题讨论】:
-
代码审查网站可能更适合这个问题。
-
一个问题:如果用户输入错误,你的程序就会崩溃。更好:导入
Text.Read并将readMaybe与traverse一起使用。出错时,使用Control.Exception.throwIO抛出正确的IO异常。 -
@dfeuer 我会等我的 40 分钟过去并交叉发布。 (自从我上次使用它以来,它已经成长了很多!)我理解您关于使代码更具弹性的反馈。然而,问题陈述保证输入将被清理,所以我想知道更多关于样式的信息。
-
foldr (+) 0只是sum。但是您可以使用length (filter (...))。此外,如果您返回两个值,则最好使用 2 元组,因为那时类型可以是异质的,此外,通过您指定的类型签名(和编译器检查),它将 always 返回 2 个值。