小编Sno*_*ual的帖子

是(反向,反向)有效吗?

很多时候,我看到在列表头部运行的函数,例如:

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)

他们是干净的,但trimTailtrimBoth效率?有没有更好的办法?

haskell

14
推荐指数
3
解决办法
816
查看次数

Haskell,Aeson和JSON解析为自定义类型

继上一篇文章之后,我发现自己完全陷入困境.我正在尝试将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)

json haskell aeson

13
推荐指数
2
解决办法
3931
查看次数

为什么Haskell的Data.Vector不是Traversable的实例?

不明白,如果Data.Map是和[].我发现了这一点,同时想知道为什么我需要Data.Vector.mapM矢量和Data.Traversable.mapM地图.

haskell

7
推荐指数
1
解决办法
614
查看次数

Haskell通过第一个空间分解单词

请注意,这与使用单词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)

它看起来有点不雅观.谁能想到更好的表达方式呢?

string haskell

6
推荐指数
1
解决办法
4423
查看次数

Haskell:如何将"\\ 0"变成"\ 0"?

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)

string haskell escaping

5
推荐指数
1
解决办法
2244
查看次数

如何在Haskell中重新实现这个Python XML解析函数?

我最近编写了以下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)

python xml haskell

4
推荐指数
2
解决办法
244
查看次数

标签 统计

haskell ×6

string ×2

aeson ×1

escaping ×1

json ×1

python ×1

xml ×1