如何在Haskell中使用(.)

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.它出什么问题了?

Car*_*ten 6

这里的问题是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)