很多时候,我看到在列表头部运行的函数,例如:
trimHead ('\n':xs) = xs
trimHead xs = xs
Run Code Online (Sandbox Code Playgroud)
然后我看到了定义:
trimTail = reverse . trimHead . reverse
Run Code Online (Sandbox Code Playgroud)
然后我看到:
trimBoth = trimHead . trimTail
Run Code Online (Sandbox Code Playgroud)
他们是干净的,但trimTail和trimBoth效率?有没有更好的办法?
继上一篇文章之后,我发现自己完全陷入困境.我正在尝试将JSON结构解析为我自己的类型,而且我不仅坚持如何解析数组,我甚至不确定我是否按预期使用了Aeson库.任何帮助将不胜感激.
代码:
data Exif = Exif [(T.Text, ExifValue)] deriving (Show)
data ExifValue =
ExifText T.Text |
ExifInt Integer |
ExifDouble Double |
ExifBool Bool |
ExifArray [ExifValue]
deriving (Show)
instance FromJSON ExifValue where
parseJSON (Number (I n)) = return $ ExifInt n
parseJSON (Number (D n)) = return $ ExifDouble n
parseJSON (String s) = return $ ExifText s
parseJSON (Bool b) = return $ ExifBool b
-- parseJSON (Array a) = ?????
instance FromJSON Exif where
parseJSON …Run Code Online (Sandbox Code Playgroud) 不明白,如果Data.Map是和[].我发现了这一点,同时想知道为什么我需要Data.Vector.mapM矢量和Data.Traversable.mapM地图.
请注意,这与使用单词function不同.
我想转换成这个:
"The quick brown fox jumped over the lazy dogs."
Run Code Online (Sandbox Code Playgroud)
进入这个:
["The"," quick"," brown"," fox"," jumped"," over"," the"," lazy"," dogs."]
Run Code Online (Sandbox Code Playgroud)
请注意每个单词后第一个空格处的断点.
我能想到的最好的是:
parts "" = []
parts s = if null a then (c ++ e):parts f else a:parts b
where
(a, b) = break isSpace s
(c, d) = span isSpace s
(e, f) = break isSpace d
Run Code Online (Sandbox Code Playgroud)
它看起来有点不雅观.谁能想到更好的表达方式呢?
Haskell有许多使用\转义序列的字符串文字.的,如\n,\t,\NUL.
如果我有字符串文字:
let s = "Newline: \\n Tab: \\t"
Run Code Online (Sandbox Code Playgroud)
如何定义escape :: String -> String将上述字符串转换为的函数:
"Newline: \n Tab: \t"
Run Code Online (Sandbox Code Playgroud)
与所有其他字符串文字转义序列相同.
我可以使用Quasi Quoting和Template Haskell,但不知道如何使用它们来实现结果.有什么指针吗?
更新:我刚刚找到了包含在Base库中的Text.ParserCombinators.ReadP模块.它支持readLitChar :: ReadS CharData.Char中的功能,它可以实现我想要的功能,但我不知道如何使用ReadP模块.我尝试了以下功能:
escape2 [] = []
escape2 xs = case readLitChar xs of
[] -> []
[(a, b)] -> a : escape2 b
Run Code Online (Sandbox Code Playgroud)
但这可能不是使用ReadP模块的正确方法.任何人都可以提供一些指示吗?
另一个更新:谢谢大家.我的最终功能如下.不错,我想.
import Text.ParserCombinators.ReadP
import Text.Read.Lex
escape xs
| [] <- r = []
| [(a,_)] <- …Run Code Online (Sandbox Code Playgroud) 我最近编写了以下Python函数,该函数将使用Google Picasa contacts.xml文件并输出带有ID和名称的字典.
def read_contacts_file(fn):
import xml.etree.ElementTree
x = xml.etree.ElementTree.ElementTree(file=fn)
q = [(u.attrib["id"], u.attrib["name"]) for u in x.iter("contact")]
return dict(q)
Run Code Online (Sandbox Code Playgroud)
这个函数的作用是返回一个字典(哈希表,映射),其中ID是键,Name是值.
该文件本身具有以下形式:
<contacts>
<contact id="f5fdaaee2e80fa01" name="Person A" display="A"/>
<contact id="8d5256298fd43877" name="Person B" display="B"/>
</contacts>
Run Code Online (Sandbox Code Playgroud)
我在Haskell中实现这个的最简单方法是什么?
只是想让你知道,在大家的帮助下,我已经设法提出以下对我有意义的事情.谢谢.
parseContactsData = M.fromList . runLA (xread >>> f)
where f =
getChildren
>>> hasName "contact"
>>> getAttrValue "id" &&& getAttrValue "name"
Run Code Online (Sandbox Code Playgroud)