具有模糊类型的组合

时间:2016-03-22 07:54:35

标签: haskell

第一次在这个标签上发帖,我仍在尝试使用该语言,但我有一些动态的FP背景,所以我已经熟悉了一些概念。

我已经定义了isZero函数。

isZero :: Int -> Bool
isZero x = x == 0

我正在尝试使用mod函数将其组合以创建isMultiple函数。

isMultiple = isZero . mod

但是,这会导致类型不匹配,因为它期望签名为a0 -> Intmoda0 -> a0 -> a0(假设这是因为它支持多个精度)。

我注意到如果我只是明确地组合它们(并提供类型签名),那么就没有问题了。

isMultiple :: Int -> Int -> Bool
isMultiple x n = isZero $ mod x n

有没有办法使用.运算符来使用具有模糊类型的撰写函数?

1 个答案:

答案 0 :(得分:6)

好吧,让我们看一下isMultiple的第一个定义中的类型:

(.)            :: (b   -> c   ) -> (a ->   b          ) -> a -> c
isZero         ::  Int -> Bool
mod            ::                   Int -> Int -> Int
                    -- same as      Int -> (Int -> Int)

正如您所看到的,b都不是一样的。这就是为什么它不起作用的原因。然而,人们可以让它发挥作用,但这不再那么容易了:

isMultiple = (isZero.) . mod
           = ((.) isZero) . mod
           = \x -> ((.) isZero) . mod $ x
           = \x -> ((.) isZero) (mod x) 
           = \x -> (.) isZero (mod x)
           = \x -> isZero . mod x

如您所见,mod x的类型为Int -> Int,因此适合(.)isZero的作文。