我创建的数据类型有点复杂。数据类型如下:
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
先谢谢!
答案 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-depends
或cabal install smallcheck
全局的cabal文件中。
然后cabal repl
或ghci 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, Or
为TwoOp
。
E.g。
Two And (Con True) (Var "x")