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.我希望这个例子可以帮助我理解如何完成这个任务.
我不确定你的要求是否合理.
这将编译:
pm :: Bar a -> Bool
pm (Bar f) = undefined
Run Code Online (Sandbox Code Playgroud)
类型f是Int -> 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到类型的值a在g 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到类型的值a在g i.