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]吗?
是的,您正在寻找的是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 toAsciiStrRun Code Online (Sandbox Code Playgroud)