鉴于以下新类型:
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
的第二个参数。我希望这个例子能帮助我理解如何完成这项任务。
答案 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
应用于a
中g 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
应用于a
中g i
类型的值。