string - 在 Haskell 中删除字符串双引号

标签 string file-io haskell

此函数生成简单的 .dot 文件,用于使用 Graphviz 可视化自动机转换函数。它的主要目的是调试大量自动生成的转换(例如,拉丁动词的变形)。

prepGraph :: ( ... ) => NFA c b a -> [String]
prepGraph nfa = "digraph finite_state_machine {"
              : wrapSp "rankdir = LR"
              : wrapSp ("node [shape = circle]" ++ (mapSp (states nfa \\ terminal nfa)))
              : wrapSp ("node [shape = doublecircle]" ++ (mapSp $ terminal nfa))
              : formatGraph nfa ++ ["}"]

formatGraph :: ( ... ) => NFA c b a -> [String]
formatGraph = map formatDelta . deltaTuples
 where formatDelta (a, a', bc) = wrapSp (mkArrow a a' ++ " " ++ mkLabel bc)
       mkArrow x y   = show x ++ " -> " ++ show y
       mkLabel (y, z) = case z of
         (Just t) -> "[ label = \"(" ++ show y ++ ", " ++ show t ++ ")\" ]"
         Nothing  -> "[ label = \"(" ++ show y ++ ", " ++ "Null" ++ ")\" ]"

其中 wrapwrapSpmapSp 是格式化函数,deltaTuples 也是如此。

问题是 formatGraph 在字符串周围保留双引号,这会导致 Graphviz 出现错误。例如,当我将 unlines $ prepGraph 打印到文件时,我会得到如下信息:

0 -> 1 [ label = "('a', "N. SF")" ];

而不是

0 -> 1 [ label = "('a', N. SF)" ];

(但是,“Null”似乎工作正常,并且输出非常好)。现在,字符串“N. SF”当然不是我用来存储变形的实际形式,但该形式确实包含一两个字符串。那么我如何告诉 Haskell:当你 show 一个 String 值时,不要双引号呢?

最佳答案

看看 Martin Erwig 如何在 Data.Graph.Inductive.Graphviz 中处理同样的问题:

http://hackage.haskell.org/packages/archive/fgl/5.4.2.3/doc/html/src/Data-Graph-Inductive-Graphviz.html

你要找的函数是底部的“sq”:

sq :: String -> String
sq s@[c]                     = s
sq ('"':s)  | last s == '"'  = init s
            | otherwise      = s
sq ('\'':s) | last s == '\'' = init s
            | otherwise      = s
sq s                         = s

(当然,检查上下文并适应您自己的代码)

关于string - 在 Haskell 中删除字符串双引号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3740621/

相关文章:

java - 将字符串转换为整数

android - 在 Android 中打开以阿拉伯语命名的文件

mysql - 加载数据mysql

list - haskell实现 "zip"奇怪的错误

haskell - 将字典变成约束

c - 微软面试题这个函数有什么错误?

java - 正则表达式模式匹配第一个和最后一个标记之间的单词,第一个单词是常量

haskell - 带谓词的惰性求值

r - 将两个数据框与字符串中具有特定模式的列合并

java - 列出 jar 文件中的 xml 文件