Here's the Haskell equivalent for anyone curious (Beware of curry[0]!):
data Article = Article { title :: String
, author :: String
, tags :: [String]
} deriving (Show)
articles = [ Article "Functional Java" "James Gosling" ["functional"]
, Article "Practical java" "James Gosling" ["enterprise","architechture"]
, Article "Imperative Haskell" "Simon P Jones" ["imperative", "purely imperative"] ]
firstJavaArticle = headMay . filter (isInfixOf "Java" . title)
allJavaArticles = filter (isInfixOf "Java" . title)
groupArticlesByAuthor = groupBy ((==) `on` author)
distinctArticleTags = nub . join . map tags
Full working code example with code imports and type signatures: import Data.List (isInfixOf, groupBy, nub)
import Safe (headMay)
import Data.Function (on)
import Control.Monad (join)
data Article = Article { title :: String
, author :: String
, tags :: [String]
} deriving (Show)
articles :: [Article]
articles = [ Article "Functional Java" "James Gosling" ["functional", "functional"]
, Article "Practical java" "James Gosling" ["enterprise","architechture"]
, Article "Imperative Haskell" "Simon P Jones" ["imperative", "purely imperative"] ]
firstJavaArticle :: [Article] -> Maybe Article
firstJavaArticle = headMay . filter (isInfixOf "Java" . title)
-- implemented in terms using allJavaArticles (NOTE: This IS performant in Haskell and IIUC due to stream fusion will only iterate once. Did not verify though.)
firstJavaArticle' :: [Article] -> Maybe Article
firstJavaArticle' = headMay . allJavaArticles
allJavaArticles :: [Article] -> [Article]
allJavaArticles = filter (isInfixOf "Java" . title)
groupArticlesByAuthor :: [Article] -> [[Article]]
groupArticlesByAuthor = groupBy ((==) `on` author)
distinctArticleTags :: [Article] -> [String]
distinctArticleTags = nub . join . map tags
main = undefined
0: http://en.wikipedia.org/wiki/Curryinghttp://tech.pro/tutorial/2011/functional-javascript-part-4-f....