Haskell中从字符到字符串的映射
我正试图弄清楚如何在Pandoc中将Haskell中从字符到字符串的映射,haskell,transliteration,Haskell,Transliteration,我正试图弄清楚如何在Pandoc中将id标识符从德语umlauts转换为ASCII。目前只有一个映射Char->Maybe Char,它将ä转换为a并将ß转换为无等,但最常见的约定是将ä映射为ae和ß转换为ss等等。以下是我到目前为止的情况: import Data.Char (isAscii) import qualified Data.Map as M asciiMap' :: M.Map Char String asciiMap' = M.fromList [('\196',"Ae"
id
标识符从德语umlauts转换为ASCII。目前只有一个映射Char->Maybe Char
,它将ä
转换为a
并将ß
转换为无
等,但最常见的约定是将ä
映射为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
我的问题是关于我的翻译
是否已经有一个内置的类似映射的函数
someMap::(a->[a])->[a]->[a]
?是的,您正在寻找的是在映射后连接输出的函数。由于[]
是一种可折叠的,因此它可以专门用于concatMap::(a->[b])->[a]->[b]
,并进一步(使用a~Char
和b~Char
)到concatMap::(Char->[Char])->[Char]->[Char
。请注意,String
是type String=[Char]
的别名,因此,String
只不过是Char
角色的列表
因此,您可以使用:
myTranslit :: String -> String
myTranslit = concatMap toAsciiStr
mytranslat::String->String
myTranslit=concatMap to Scienistr
您可以使整个内容尽可能简洁
myTranslit :: String -> String
myTranslit = concatMap $ \c -> case c of
'Ä' -> "Ae"
'Ö' -> "Oe"
'Ü' -> "Ue"
'ä' -> "ae"
'ö' -> "oe"
'ü' -> "ue"
'ß' -> "ss"
_ | isAscii c = [c]
| otherwise = ""
伟大的我尝试了你的编辑,现在它工作了:)我意识到String
是[Char]
,并且实际上期望一个类型为::(a->[a])->[a]->[a]
的函数,也许我应该编辑这个问题……有趣的选项,特别是在我的情况下,与Pandoc的集成无论如何都必须改变。