在Haskell中访问部分代数数据类型的惯用方法是什么?

时间:2016-01-13 16:01:39

标签: haskell

使用值test调用函数x比使用case表达式更容易吗?

data FooBar = Foo Int | Bar String

test :: Maybe Int -> Bool -- Int from Foo constructor

x :: FooBar

2 个答案:

答案 0 :(得分:2)

一种更简单的方法是定义一个帮助程序,让您在那里找到一部分:

data FooBar = Foo Int | Bar String

foo :: FooBar -> Maybe Int
foo (Foo x) = Just x
foo _ = Nothing

test :: Maybe Int -> Bool
x :: FooBar

result :: Bool
result = test . foo $ x

如果你是定义test的人,你也可以用不同的方式定义它,以便让自己更轻松:

test' :: FooBar -> Bool
test' (Foo x) = (some logic)
test' _ = (the default value)

有一个简洁的概念称为" prism"模拟这个一般概念 - 从和类型中提取数据 - 优雅。但他们有点难以理解,他们是否可以被认为是"惯用的"很有争议。

答案 1 :(得分:-1)

您可以在将FooBar作为参数处理的函数中使用保护或模式匹配。