FizzBu​​zz清理

Jon*_*lap 7 haskell fizzbuzz

我还在学习Haskell,我想知道使用一行代码表达以下语句是否有一种不那么冗长的方式:

map (\x -> (x, (if mod x 3 == 0 then "fizz" else "") ++ 
 if mod x 5 == 0 then "buzz" else "")) [1..100]
Run Code Online (Sandbox Code Playgroud)

产品: [(1,""),(2,""),(3,"fizz"),(4,""),(5,"buzz"),(6,"fizz"),(7,""),(8,""),(9,"fizz"),(10,"buzz"),(11,""),(12,"fizz"),(13,""),(14,""),(15,"fizzbuzz"),(16,""),(17,""),(18,"fizz"),(19,""),(20,"buzz"),(21,"fizz"),(22,""),(23,""),(24,"fizz"),(25,"buzz"),(26,""),(27,"fizz"),(28,""),(29,""),(30,"fizzbuzz")

感觉就像我对语法的斗争比我应该做的更多.我在Haskell中已经看到了其他问题,但是我正在寻找在单个语句中表达这一点的最佳方式(试图理解如何更好地处理语法).

Lan*_*dei 10

我们不需要stinkin' mod......

zip [1..100] $ zipWith (++) (cycle ["","","fizz"]) (cycle ["","","","","buzz"])
Run Code Online (Sandbox Code Playgroud)

或略短

import Data.Function(on)

zip [1..100] $ (zipWith (++) `on` cycle) ["","","fizz"] ["","","","","buzz"]
Run Code Online (Sandbox Code Playgroud)

或蛮力方式:

zip [1..100] $ cycle ["","","fizz","","buzz","fizz","","","fizz","buzz","","fizz","","","fizzbuzz"]
Run Code Online (Sandbox Code Playgroud)


ham*_*mar 7

如果你坚持单线:

[(x, concat $ ["fizz" | mod x 3 == 0] ++ ["buzz" | mod x 5 == 0]) | x <- [1..100]]
Run Code Online (Sandbox Code Playgroud)

  • 顺便说一句,Haskell中的列表是单链表,而不是数组; 数组(例如[array](http://hackage.haskell.org/package/array)和[vector](http://hackage.haskell.org/package/vector)包中的数组)相对较少使用与其他语言相比. (2认同)