'newtype`上的模式匹配

时间:2014-12-26 02:56:16

标签: haskell pattern-matching

鉴于以下新类型:

newtype Bar a = Bar { biz :: Int -> Int -> Int }

是否可以在Int -> Int参数上进行模式匹配?

示例,让我们说我想在Bar上模式化马赫,然后在前两个参数上进行模式匹配。

pm :: Bar a -> Bool
pm (Bar (x y)) = x == y

然而我收到编译时错误:

Prelude> :l NewtypeWork.hs
[1 of 1] Compiling Main             ( NewtypeWork.hs, interpreted )

NewtypeWork.hs:13:10: Parse error in pattern: x
Failed, modules loaded: none.

总的来说,我试图理解如何fmap超过函数Int -> a的第二个参数。我希望这个例子能帮助我理解如何完成这项任务。

1 个答案:

答案 0 :(得分:7)

我不确定你的要求是否合理。

这将编译:

pm :: Bar a -> Bool
pm (Bar f) = undefined

f的类型为Int -> Int -> Int。您如何建议将f变为Bool

例如,f可能会添加Ints - (+)

pm的有效定义示例是:

pm (Bar f) = f 1 3 > 0

更新

要回答评论中的问题,请先考虑:

data Foo a = Int -> a

然后Foo可以变成一个仿函数:

(fmap f g)i = f(g i) - g :: Int - > a,f :: a - > B'/ P>

即。您只是将f应用于ag i类型的值。

现在您可以推断出这种数据类型:

data Bar a = Int -> Maybe (a, Int)

根据定义:

(fmap f g) i = case g i of
                 Nothing -> Nothing
                 Just (a,j) -> Just (f a, j)

同样,我们只是将f应用于ag i类型的值。