我知道在 Haskell中不可能对函数进行模式匹配,我完全理解为什么。但是,我有两个密切相关的问题。首先,如果您想部分应用函数以供以后使用,如果它是一个元组,是否有定义和捕获返回的方法?还是我错了,这仍在尝试在我的眼皮底下匹配功能?
例如,假设我试图获得一个十的多个倍数的商和余数。那么,我该如何写这样的东西呢?
q, r :: Integral a => a -> a
(q, r) = (12345 `quotRem`)
我在这里意识到,存在单独的功能,所以我可以这样做:
q, r :: Integral a => a -> a
q = (12345 `quot`)
r = (12345 `rem`)
但是,这是一个非常特殊的情况,并且有无数其他返回元组的函数示例可以很好地概括。例如,返回列表中偶数和奇数的函数。
evens, odds :: Integral a => [a] -> Int
(evens, odds) = (length . (filter even), length . (filter odd))
这引出了我的第二个问题。以上在 GHCi 中工作得很好。
Prelude> let (evens, odds) = (length . (filter even), length . (filter odd))
Prelude> :t evens
evens :: Integral a => [a] -> Int
Prelude> evens [1..10]
5
更令人困惑的是,它甚至可以通过“模式匹配”来工作,就像我一开始玩的一样(q, r)
:
Prelude> let evensOdds = (length . (filter even), length . (filter odd))
Prelude> :t evensOdds
evensOdds :: (Integral a1, Integral a) => ([a1] -> Int, [a] -> Int)
Prelude> let (ev,od) = evensOdds
Prelude> :t ev
ev :: Integral a1 => [a1] -> Int
Prelude> ev [1..10]
5
它在加载到 GHCi 的实际文件中也可以正常工作,即使(evens, odds)
没有。为什么这两个不同,如果第二个不能正常工作,为什么在 GHCi 中工作?可以以某种方式利用这里的不同之处吗?