第一次在这个标签上发帖,我仍在尝试使用该语言,但我有一些动态的FP背景,所以我已经熟悉了一些概念。
我已经定义了isZero
函数。
isZero :: Int -> Bool
isZero x = x == 0
我正在尝试使用mod
函数将其组合以创建isMultiple
函数。
isMultiple = isZero . mod
但是,这会导致类型不匹配,因为它期望签名为a0 -> Int
而mod
为a0 -> a0 -> a0
(假设这是因为它支持多个精度)。
我注意到如果我只是明确地组合它们(并提供类型签名),那么就没有问题了。
isMultiple :: Int -> Int -> Bool
isMultiple x n = isZero $ mod x n
有没有办法使用.
运算符来使用具有模糊类型的撰写函数?
答案 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
的作文。