我正试图弄清楚如何从德语变音符号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
?
答案 0 :(得分:7)
是的,你要找的是concatMap :: Foldable t => (a -> [b]) -> t a -> [b]
,它在映射后连接输出。由于[]
是Foldable
,因此可以concatMap :: (a -> [b]) -> [a] -> [b]
中的专门化,并进一步(使用a ~ Char
和b ~ 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 = ""