如何在Haskell中创建我的预定义数据类型的值

时间:2016-05-21 10:07:46

标签: haskell

我创建的数据类型有点复杂。数据类型如下:

data MyData = Var String | Con Bool |  Two TwoOp MyData MyData | List [MyData]
 deriving Show

data TwoOp = And | Or deriving Show

我的问题如下:给出两个“MyData”类型的值我如何使用构造函数Two,TwoOp来构建一个新的“MyData”值:

Two TwoOp MyData MyData

先谢谢!

2 个答案:

答案 0 :(得分:3)

我将就使用交互式翻译GHCi

提供答案

将您的定义放在文件MyFile.hs

module MyFile where

data MyData = Var String
            | Con Bool
            | Two TwoOp MyData MyData
            | List [MyData]
            deriving Show
data TwoOp = And
           | Or
           deriving Show

现在将其加载到GHCi

$> ghci MyFile.hs
GHCi, version 7.10.3: http://www.haskell.org/ghc/  :? for help
[1 of 1] Compiling MyFile           ( MyFile.hs, interpreted )
Ok, modules loaded: MyFile.
*MyFile> let a = Var "test"
*MyFile> let true = Con True
*MyFile> let false = Con False
*MyFile> a
Var "test"
*MyFile> true
Con True
*MyFile> false
Con False
*MyFile> Two And a true
Two And (Var "test") (Con True)
*MyFile> List [a,true,false, Var "this is also a test"]
List [Var "test",Con True,Con False,Var "this is also a test"]

注意:如果您在文件中使用构造函数(顶级),则不需要let个关键字。

module MyFile where

...

testdata :: Mydata
testdata = Two And (Var "x") (Con False)

更新

但老实说,使用SmallCheck手工编写测试数据有点单调乏味,这可以通过您的计算机来完成,只需稍微修改一下您的文件 - 注意您可以开始使用它,并了解它的背景以后如果你是初学者。 documentation是一个很好的起点。

{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE DeriveGeneric #-}

module MyFile where

import Test.SmallCheck.Series
import GHC.Generics

data MyData = Var String
            | Con Bool
            | Two TwoOp MyData MyData
            | List [MyData]
            deriving(Show, Generic)

instance Monad m => Serial m MyData

data TwoOp = And
           | Or
           deriving(Show, Generic)

instance Monad m => Serial m TwoOp

注意:您需要将smallcheck放在build-dependscabal install smallcheck全局的cabal文件中。

然后cabal replghci MyFile.hs(或stack ghci)应将文件加载到解释器中。

$> stack ghci
Configuring GHCi with the following packages: generate
GHCi, version 7.10.3: http://www.haskell.org/ghc/  :? for help
[1 of 1] Compiling MyFile           ( MyFile.hs, interpreted )
Ok, modules loaded: MyFile.
*MyFile MyFile> import Test.SmallCheck.Series
*MyFile MyFile Test.SmallCheck.Series> randomData <- listM 3 (series :: Series IO MyData)
*MyFile MyFile Test.SmallCheck.Series> length randomData
38
*MyFile MyFile Test.SmallCheck.Series> mapM_ print randomData
Var ""
Two And (Var "") (Var "")
Con True
List []
Var "a"
Two Or (Var "") (Var "")
Con False
Two And (List []) (Var "")
Var "b"
Two Or (List []) (Var "")
Two And (Var "") (List [])
Two Or (Var "") (List [])
Two And (Con True) (Var "")
...

答案 1 :(得分:2)

您需要使用构造函数来构造值。值构造函数是在data .. =之后和每个连续|之后找到的那些标识符。

在您的情况下,值构造函数为Var, Con, Two, List类型MyData,类型And, OrTwoOp

E.g。

Two And (Con True) (Var "x")