【问题标题】:Pattern Match on `newtype``newtype` 上的模式匹配
【发布时间】:2014-12-26 02:56:15
【问题描述】:

给定以下新类型:

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.

总体而言,我试图了解如何在函数 Int -> a 的第二个参数上使用 fmap。我希望这个例子能帮助我理解如何完成这个任务。

【问题讨论】:

  • 问题的两个部分可能没有按照您的想法联系起来。在Bar 中,从未使用过类型参数a(这就是所谓的幻像类型参数)。因此,Bar 的唯一有效 Functor 实例是 fmap _ b = b

标签: haskell pattern-matching


【解决方案1】:

我不确定你问的是否有意义。

这将编译:

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

即您只是将f 应用于g ia 类型的值。

现在您可以推断此数据类型:

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 应用于g ia 类型的值。

【讨论】:

  • 是的,我认为这也没有道理。我的问题基本上是如何 fmap 函数 Int -> Maybe (a, Int)
  • 如果你有newtype T a = T (Int -> Maybe (Int, a)),那么T 的Functor 实例就是fmap f (T a) = T (fmap (fmap (fmap f)) a)。这是因为(->) a(,) aMaybe是函子,函子的组合就是函子。
  • 毫无疑问,这个评论和答案很有帮助,但我仍然没有完全理解。另一个question 可能会帮助像我这样的其他人。
猜你喜欢
  • 1970-01-01
  • 2015-09-30
  • 1970-01-01
  • 1970-01-01
  • 2019-03-19
  • 2016-11-27
  • 2018-11-09
  • 2023-03-05
  • 1970-01-01
相关资源
最近更新 更多