在Haskell中从Char到String映射

Wol*_*olf 3 haskell transliteration

我正在试图弄清楚如何在Pandoc中改进从德语变音符号到ASCII用于id标识符的音译.目前只有一个映射Char -> Maybe Char,即转换ä成a和ß成Nothing等,但最常见的约定映射ä到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
Run Code Online (Sandbox Code Playgroud)

我的问题是关于myTranslit.

可能已经有一个内置的类似地图的功能someMap :: (a -> [a]) -> [a] -> [a]吗?

Wil*_*sem 8

是的,您正在寻找的是concatMap :: Foldable t => (a -> [b]) -> t a -> [b],在映射后连接输出.因为[]是a Foldable,所以它可以专注于concatMap :: (a -> [b]) -> [a] -> [b],并且进一步(有a ~ Char和b ~ Char)concatMap :: (Char -> [Char]) -> [Char] -> [Char].请注意,这String是一个别名type String = [Char],a String只是一个Characters 列表.

你可以这样使用:

myTranslit :: String -> String
myTranslit = concatMap toAsciiStr
Run Code Online (Sandbox Code Playgroud)