我正在尝试在Haskell中编写如下内容:

length . nub . intersect

但这不起作用。
*Main Data.List> :t intersect
intersect :: Eq a => [a] -> [a] -> [a]
*Main Data.List> :t nub
nub :: Eq a => [a] -> [a]
*Main Data.List> :t length
length :: [a] -> Int

基于类型,我的理解是intersect返回一种[a]并捐赠给nub,该类型恰好采用一种[a],然后还将一种[a]类型返回到length,最后返回的应该是Int。它出什么问题了?

最佳答案

这里的问题是intersect接受2个参数(在某种意义上)

您可以明确提供其中一个参数:

> let f a = length . nub . intersect a
> :t f
f :: Eq a => [a] -> [a] -> Int

或者您可以使用一个有趣的小运算符,例如(.:) = (.) . (.):
> let (.:) = (.) . (.)
> :t length .: (nub .: intersect)
length .: (nub .: intersect) :: Eq a => [a] -> [a] -> Int

这是不需要括号的版本:

导入Data.List
infixr 9 .:

(.:) :: (c -> d) -> (a -> b -> c) -> a -> b -> d
(.:) = (.).(.)

f :: Eq a => [a] -> [a] -> Int
f = length .: nub .: intersect

关于haskell - 如何在Haskell中使用(.),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/25738171/

10-09 20:21
查看更多