'newtype`上的模式匹配

Kev*_*ith 2 haskell pattern-matching

鉴于以下新类型:

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

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

例如,假设我想对Mach进行Bar模式化,然后对前两个参数进行模式匹配.

pm :: Bar a -> Bool
pm (Bar (x y)) = x == y
Run Code Online (Sandbox Code Playgroud)

然而,我得到一个编译时错误:

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.
Run Code Online (Sandbox Code Playgroud)

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

Eri*_*ikR 7

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

这将编译:

pm :: Bar a -> Bool
pm (Bar f) = undefined
Run Code Online (Sandbox Code Playgroud)

类型fInt -> Int -> Int.你怎么建议f变成一个Bool

例如,f可能是Ints的添加 - (+).

有效定义的一个例子pm是:

pm (Bar f) = f 1 3 > 0
Run Code Online (Sandbox Code Playgroud)

更新:

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

data Foo a = Int -> a
Run Code Online (Sandbox Code Playgroud)

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

(fmap fg)i = f(gi) - g :: Int - > a,f :: a - > b

即您是刚刚申请f到类型的值ag i.

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

data Bar a = Int -> Maybe (a, Int)
Run Code Online (Sandbox Code Playgroud)

根据定义:

(fmap f g) i = case g i of
                 Nothing -> Nothing
                 Just (a,j) -> Just (f a, j)
Run Code Online (Sandbox Code Playgroud)

再一次,我们只把它运用f到类型的值ag i.