这是一个我一直想知道的问题.如果语句是大多数编程语言中的主要语言(至少是我曾经使用过的语句),但在Haskell中,它似乎很不受欢迎.我理解,对于复杂情况,Haskell的模式匹配比一堆ifs更清晰,但是有什么真正的区别吗?
举一个简单的例子,拿一个自制版本的总和(是的,我知道它可能只是foldr (+) 0):
sum :: [Int] -> Int
-- separate all the cases out
sum [] = 0
sum (x:xs) = x + sum xs
-- guards
sum xs
| null xs = 0
| otherwise = (head xs) + sum (tail xs)
-- case
sum xs = case xs of
[] -> 0
_ -> (head xs) + sum (tail xs)
-- if statement
sum xs = if null xs then 0 else (head xs) + …Run Code Online (Sandbox Code Playgroud) 我一直在努力学习如何从Haskell中的HTML文件中提取数据,并且已经碰壁了.我根本不熟悉Haskell,而我之前的知识来自Python(以及用于HTML解析的BeatifulSoup).
我正在使用TagSoup查看我的HTML(似乎是推荐的),并且对它的工作原理有一个基本的了解.这是我的代码的基本部分(自包含,并输出测试信息):
import System.IO
import Network.HTTP
import Text.HTML.TagSoup
import Data.List
main :: IO ()
main = do
http <- simpleHTTP (getRequest "http://www.cbssports.com/nba/scoreboard/20130310") >>= getResponseBody
let tags = dropWhile (~/= TagOpen "div" []) (parseTags http)
done tags where
done xs = case xs of
[] -> putStrLn $ "\n"
_ -> do
putStrLn $ show $ head xs
done (tail xs)
Run Code Online (Sandbox Code Playgroud)
但是,我并没有试图找到任何"div"标签.我希望以这样的格式删除标记之前的所有内容:
TagOpen "div" [("id","scores-1997830"),("class","scoreBox spanCol2")]
TagOpen "div" [("id","scores-1997831"),("class","scoreBox spanCol2 lastCol")]
Run Code Online (Sandbox Code Playgroud)
我试过把它写出来:
let tags = dropWhile (~/= TagOpen "div" [("id", "scores-[0-9]+"), …Run Code Online (Sandbox Code Playgroud)