我正在尝试在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/