use*_*256 2 haskell combinators pointfree function-composition dot-operator
我想在Haskell中写这样的东西:
length . nub . intersect
Run Code Online (Sandbox Code Playgroud)
但它不起作用.
*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
Run Code Online (Sandbox Code Playgroud)
根据上式,我的理解是,intersect返回类型[a],并捐赠给nub,这恰恰是一个类型的[a],然后也返回一个类型[a]来length,最后返回应该是一个Int.它出什么问题了?
这里的问题是intersect 需要2个参数(从某种意义上说)
你可以明确地提供一个参数:
> let f a = length . nub . intersect a
> :t f
f :: Eq a => [a] -> [a] -> Int
Run Code Online (Sandbox Code Playgroud)
或者你可以使用一个有趣的小运营商,如(.:) = (.) . (.):
> let (.:) = (.) . (.)
> :t length .: (nub .: intersect)
length .: (nub .: intersect) :: Eq a => [a] -> [a] -> Int
Run Code Online (Sandbox Code Playgroud)
这是一个你不需要parens的版本:
import Data.List
infixr 9 .:
(.:) :: (c -> d) -> (a -> b -> c) -> a -> b -> d
(.:) = (.).(.)
f :: Eq a => [a] -> [a] -> Int
f = length .: nub .: intersect
Run Code Online (Sandbox Code Playgroud)