Plural 0.0.1 → 0.0.2
raw patch · 3 files changed
+148/−12 lines, 3 files
Files
- Language/English/Plural.hs +143/−0
- Main.hs +0/−4
- Plural.cabal +5/−8
+ Language/English/Plural.hs view
@@ -0,0 +1,143 @@+module Language.English.Plural where++import Data.Map (Map)+import Text.Regex.TDFA++import qualified Data.Map as M++-- | Get plural format.+plural :: String -> String+plural xs = do+ let ys = M.filterWithKey (\k _ -> xs =~ k :: Bool) pluralKnowledge+ case M.minViewWithKey ys of+ -- Get plural format if found match.+ Just ((k, a), _) -> + do+ let (before, match, _) = xs =~ k :: (String, String, String)+ if a =~ "^\\\\&" :: Bool + -- Plural mix `match` part and special suffix if `a` match \\&+ -- At this, \\& is speical regex for replace `match` part+ -- Example, word `day` with `("[aeiou]y", "\\&s")`, `match` part+ -- is `ay`, then `\\&` replace `ay`, and result is `days`.+ then do+ let (_, _, s) = a =~ "^\\\\&" :: (String,String,String)+ before ++ match ++ s+ -- Otherwise plural is suffix string.+ else before ++ a+ -- Otherwise return origianl one.+ Nothing -> xs++-- | Try get plural format of word with number.+tryPlural :: Int -> String -> String+tryPlural n s+ | n `elem` [0, 1] = s+ | otherwise = plural s++-- | The knowledge for plural process.+pluralKnowledge :: Map String String+pluralKnowledge = + M.fromAscList+ [("ss$", "sses")+ ,("zz$", "zzes") -- Example: "buzzes".+ ,("sh$", "shes")+ ,("tch$", "tches")+ ,("eaf$", "eaves")+ ,("ief$", "ieves") -- Example: "thieves".+ ,("roof$", "roofs")+ ,("oof$", "ooves")+ ,("ife$", "ives")+ ,("lf$", "lves")+ ,("[aeiou]y$", "\\&s") -- \\& for replace match string+ ,("ndum$", "nda") -- Example: "addendum".+ ,("um$", "a") -- Example: "media", "criteria", "symposia",+ -- "crania", curriculum", "data".+ ,("^die$", "dice")+ ,("dogma$", "dogmas") -- exception to -ma rule.+ ,("lemma$", "lemmas") -- exception to -ma rule.+ ,("schema$", "schemas") -- exception to -ma rule.+ ,("ia$", "ium") -- Example: "bacteria".+ ,("ma$", "mata") -- Example: "stigma".+ ,("na$", "nae") -- Example: "antenna".+ ,("ta$", "tum") -- Example: "strata".+ ,("Atlas$", "Atlantes") -- Case-sensitive+ ,("atlas$", "atlases")+ ,("Harry$", "Harrys") -- Case-sensitive+ ,("aircraft$", "aircraft")+ ,("alga$", "algae")+ ,("alumna$", "alumnae")+ ,("alumnus$", "alumni")+ ,("ameoba$", "ameobae")+ ,("automaton$", "automata")+ ,("bacillus$", "bacilli")+ ,("banjo$", "banjos")+ ,("beau$", "beaux")+ ,("cactus$", "cacti") -- Or "cactuses".+ ,("cannon$", "cannon") -- Or "cannons".+ ,("canto$", "cantos")+ ,("cargo$", "cargos")+ ,("cattle$", "cattle")+ ,("child$", "children")+ ,("cod$", "cod")+ ,("corpus$", "corpora")+ ,("dwarf$", "dwarves")+ ,("cs$", "csen") -- Example: "emacsen".+ ,("foot$", "feet")+ ,("formula$", "formulae")+ ,("graffito$", "graffiti")+ ,("rion$", "ria") -- Example: "criteria".+ ,("deer$", "deer")+ ,("focus$", "foci")+ ,("genus$", "genera")+ ,("goose$", "geese")+ ,("hedron$", "hedra") -- Example: "polyhedron".+ ,("hippopotamus$", "hippopotami")+ -- ("index$", "indices") -- "indexes" is also acceptable.+ ,("insigne$", "insignia")+ ,("life$", "lives")+ ,("louse$", "lice")+ ,("mackerel$", "mackerel")+ ,("man$", "men")+ ,("matrix$", "matrices")+ ,("moose$", "moose")+ ,("motto$", "mottos")+ ,("mouse$", "mice")+ ,("nucleus$", "nuclei")+ ,("octopus$", "octopi") -- Or "octopuses".+ ,("offspring", "offspring")+ ,("opus$", "opera")+ ,("\\box$", "oxen")+ ,("panino$", "panini")+ ,("paparazzo$", "paparazzi")+ ,("phalanx$", "phalanges")+ ,("phenomenon$", "phenomena")+ ,("people$", "people")+ ,("perch$", "perch") -- Can certain uses of "perch" be plural?+ ,("piano$", "pianos")+ ,("police$", "police")+ ,("portico$", "porticos")+ ,("quarto$", "quartos")+ ,("radius$", "radii")+ ,("rhinoceros$", "rhinoceri") -- Or "rhinoceroses".+ -- ("series$", "series") -- Already has an "s".+ ,("sheep$", "sheep")+ -- ("species$", "species") -- Already has an "s".+ ,("solo$", "solos")+ ,("syllabus$", "syllabi")+ ,("terminus$", "termini")+ ,("ulus$", "uli") -- Example: "stimuli".+ ,("trout$", "trout")+ ,("tooth$", "teeth")+ ,("uterus$", "uteri") -- Or "uteruses".+ ,("virtuoso", "virtuosi")+ ,("viscus$", "viscera")+ -- ("woman$", "women") -- See "man$".+ -- ("e$", "es") -- Fall-through to "[^s]$".+ ,("is$", "es") -- Example: "axes", "crises", "testes".+ ,("us$", "uses") -- Example: "campuses", "platypuses", "prospectuses".+ ,("io$", "ios")+ ,("oo$", "oos")+ ,("o$", "oes")+ ,("y$", "ies")+ ,("[ei]x$", "ices") -- Example: "vertices".+ ,("x$", "xes")+ ,("[^s]$", "\\&s")] -- \\& for replace match string
− Main.hs
@@ -1,4 +0,0 @@-module Main where--main :: IO ()-main = return ()
Plural.cabal view
@@ -1,5 +1,5 @@ name: Plural-version: 0.0.1+version: 0.0.2 Cabal-Version: >= 1.6 license: GPL-3 license-file: LICENSE@@ -13,11 +13,8 @@ tested-with: GHC==6.10.4 build-type: Simple-extra-source-files: Setup.lhs -executable plural- build-depends: containers >= 0.2.0.1, regex-tdfa >= 1.1.2, base >= 4 && < 5- main-is: Main.hs- other-modules: - extensions:- ghc-options: -fwarn-unused-matches -fwarn-unused-binds -fwarn-unused-imports -fwarn-overlapping-patterns -fwarn-duplicate-exports+Library+ Exposed-Modules:+ Language.English.Plural + Build-depends: containers >= 0.2.0.1, regex-tdfa >= 1.1.2, base >= 4 && < 5