Haskell简明教程(五):处理JSON

栏目: 编程语言 · 发布时间: 5年前

内容简介:这一系列是我学习这个系列主要分为五个部分:本文有参考 《Real World Haskell》

这一系列是我学习 Learn You a Haskell For Great Good 之后,总结,编写的学习笔记。

这个系列主要分为五个部分:

本文有参考 《Real World Haskell》

Haskell如何表示JSON

json 是一种数据表现形式,来源于 javascript。JSON中有四种基本的值的类型:

  • number
  • boolean: true/false
  • string
  • null

此外有两种容器类型:

  • array
  • object

那么Haskell我们需要如何表示成JSON呢?我们需要一个 value constructor 加上Haskell自带的类型来表示:

data JValue = JNumber Integer
          | JString String
          | JBoolean Bool
          | JNull
          | JArray [JValue]
          | JObject [(String, JValue)]
            deriving (Show, Ord, Eq)

那么我们要如何输出JSON呢?其类型肯定是这样的:

echoJValue :: JValue -> String

我们分别为 string, bool, null, number 定义好如何输出成JSON:

echoJValue (JNumber i) = show i
echoJValue (JString s) = show s
echoJValue (JBoolean True) = "true"
echoJValue (JBoolean False) = "false"
echoJValue JNull = "null"

array该怎么处理?输出 "[" 之后输出array中的内容,然后输出 "]",所以是:

echoJValue (JArray a) = "[" ++ handleArray a ++ "]"
    where handleArray [] = ""
          handleArray a = intercalate ", " (map echoJValue a)

而object则是:

echoJValue (JObject a) = "{" ++ handleObject a ++ "}"
    where handleObject [] = ""
          handleObject a = intercalate ", " (map handleKV a)
          handleKV (k,v) = k ++ ": " ++ echoJValue v

此处我们需要导入 Data.List 中的 intercalate 函数:

Prelude> :m Data.List
Prelude Data.List> :t intercalate 
intercalate :: [a] -> [[a]] -> [a]
Prelude Data.List> intercalate ", " ["hello", "world"]
"hello, world"

于是我们便可以输出自定义的JSON了。

Prelude> :l JSON
[1 of 1] Compiling Main             ( JSON.hs, interpreted )
Ok, 1 module loaded.
*Main> JNull
JNull
*Main> JNumber 1
JNumber 1
*Main> JString "hello"
JString "hello"
*Main> JBoolean True
JBoolean True
*Main> JBoolean False
JBoolean False
*Main> JArray [JBoolean True, JBoolean False]
JArray [JBoolean True,JBoolean False]
*Main> echoJValue $ JArray [JBoolean True, JBoolean False]
"[true, false]"
*Main> echoJValue $ JObject [("hello", JNumber 1), ("world", JString "world")]
"{hello: 1, world: \"world\"}"

我们可以把整个文件做成一个Module:

module JSON (
    JValue(..),
    echoJValue
    ) where 

import Data.List (intercalate)


data JValue = JNumber Integer
          | JString String
          | JBoolean Bool
          | JNull
          | JArray [JValue]
          | JObject [(String, JValue)]
            deriving (Show, Ord, Eq)


echoJValue :: JValue -> String
echoJValue (JNumber i) = show i
echoJValue (JString s) = show s
echoJValue (JBoolean True) = "true"
echoJValue (JBoolean False) = "false"
echoJValue JNull = "null"
echoJValue (JArray a) = "[" ++ handleArray a ++ "]"
    where handleArray [] = ""
          handleArray a = intercalate ", " (map echoJValue a)
echoJValue (JObject a) = "{" ++ handleObject a ++ "}"
    where handleObject [] = ""
          handleObject a = intercalate ", " (map handleKV a)
          handleKV (k,v) = k ++ ": " ++ echoJValue v

那我们该要怎样 pretty print呢?这就留作思考吧 :) (提示:Haskell的世界,递归总是那么重要)

总结

到此Haskell教程便结束了,我们从最开始的命令式语言如何抽象,到介绍Haskell的基本语法和要素, TypeClass, Functor, Applicative, Monoid, Monad,到随后我们封装一个简单的JSON模块。简略的 浏览了一下Haskell的面貌,但是Haskell抽象程度很高,为此付出的代价便是不那么容易一眼就看出来, 有时候甚至需要来回看,来回琢磨才能领会其中的意义。

之后我将会写一些散篇,主要是Haskell和现实世界的应用,或者是Haskell的源代码分析。

参考资料:


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

数据结构

数据结构

霍罗威茨 / 机械工业出版社 / 2006-7-1 / 48.00元

《数据结构》(C语言版)针对采用ANSI C实现数据结构进行了全面的描述和深入的讨论。书中详细讨论了栈、队列、链表以及查找结构、高级树结构等功能,对裴波那契堆、伸展树、红黑树、2-3树、2-3-4树、二项堆、最小-最大堆、双端堆等新的数据结构进行了有效分析。《数据结构》(C语言版)对一些特殊形式的堆结构,诸如应用在双端优先队列中的最小-最大堆和双端堆的数据结构以及左高树、裴波那契堆、二项堆等数据结......一起来看看 《数据结构》 这本书的介绍吧!

CSS 压缩/解压工具
CSS 压缩/解压工具

在线压缩/解压 CSS 代码

RGB HSV 转换
RGB HSV 转换

RGB HSV 互转工具

HEX HSV 转换工具
HEX HSV 转换工具

HEX HSV 互换工具