在Haskell中从Char到String的映射

时间:2017-06-25 12:18:25

标签: haskell transliteration

我正试图弄清楚如何从德语变音符号improve the transliteration到Pandoc中的id标识符的ASCII。目前只有一个映射Char -> Maybe Char,可将ä转换为a,将ß转换为Nothing等,但最常见的约定映射{{1} } äae进入ß等等。以下是我到目前为止的情况:

ss

我的问题是关于import Data.Char (isAscii) import qualified Data.Map as M asciiMap' :: M.Map Char String asciiMap' = M.fromList [('\196',"Ae") ,('\214',"Oe") ,('\220',"Ue") ,('\223',"ss") ,('\228',"ae") ,('\246',"oe") ,('\252',"ue") ] toAsciiStr :: Char -> String toAsciiStr c | isAscii c = [c] | otherwise = M.findWithDefault "" c asciiMap' myTranslit :: String -> String myTranslit [] = [] myTranslit (x:xs) = toAsciiStr x ++ myTranslit xs

是否已经有内置的地图式函数myTranslit

2 个答案:

答案 0 :(得分:7)

是的,你要找的是concatMap :: Foldable t => (a -> [b]) -> t a -> [b],它在映射后连接输出。由于[]Foldable,因此可以concatMap :: (a -> [b]) -> [a] -> [b]中的专门化,并进一步(使用a ~ Charb ~ Char){ {1}}。请注意,concatMap :: (Char -> [Char]) -> [Char] -> [Char]String的别名,因此,type String = [Char]只不过是String列表。

您可以这样使用:

Char

答案 1 :(得分:4)

你可以将整个事情简洁为

myTranslit :: String -> String
myTranslit = concatMap $ \c -> case c of
  'Ä' -> "Ae"
  'Ö' -> "Oe"
  'Ü' -> "Ue"
  'ä' -> "ae"
  'ö' -> "oe"
  'ü' -> "ue"
  'ß' -> "ss"
  _ | isAscii c  = [c]
    | otherwise  = ""