Haskell:具有条件的自定义类型

Ale*_*lex 5 haskell types

我是一个哈斯克尔新手,我找不到这个问题的答案.

我们可以用条件定义类型吗?例如,简单的用户定义数据类型将是:

data MyList = MyList [a]
Run Code Online (Sandbox Code Playgroud)

我可以以某种方式修改此代码,以便MyList构造函数只能采用具有偶数元素的列表吗?就像是

data MyList = MyList [a] where (even (length a))
Run Code Online (Sandbox Code Playgroud)

谢谢!

Dar*_*rio 7

不,你不能.

如果真的有必要,那就自己编写一个类似于构造函数的函数.

toMyList :: [a] -> MyList
toMyList l | even (length l) = MyList l
           | otherwise       = error "Length of list has to be even"
Run Code Online (Sandbox Code Playgroud)

或者如果可能发生错误检查:

toMyList :: [a] -> Maybe MyList
Run Code Online (Sandbox Code Playgroud)

但是根据用例,也许您可​​以通过类型(例如元组或两个列表)表达自己,而不是通过运行时检查.