Is eta reduction possible?

后端 未结 4 891
囚心锁ツ
囚心锁ツ 2021-01-12 20:25

Is it possible to apply eta reduction in below case?

let normalise = filter (\\x -> Data.Char.isLetter x || Data.Char.isSpace x )

I was

相关标签:
4条回答
  • 2021-01-12 20:43

    Your solution doesn't work, because (||) works on Bool values, and Data.Char.isLetter and Data.Char.isSpace are of type Char -> Bool.

    pl gives you:

    $ pl "f x = a x || b x"
    f = liftM2 (||) a b
    

    Explanation: liftM2 lifts (||) to the (->) r monad, so it's new type is (r -> Bool) -> (r -> Bool) -> (r -> Bool).

    So in your case we'll get:

    import Control.Monad
    let normalise = filter (liftM2 (||) Data.Char.isLetter Data.Char.isSpace)
    
    0 讨论(0)
  • 2021-01-12 20:45
    import Control.Applicative
    let normalise = filter ((||) <$> Data.Char.isLetter <*> Data.Char.isSpace)
    
    0 讨论(0)
  • 2021-01-12 21:05

    Another solution worth looking at involves arrows!

    import Control.Arrow
    
    normalize = filter $ uncurry (||) . (isLetter &&& isSpace)
    

    &&& takes two functions (really arrows) and zips together their results into one tuple. We then just uncurry || so it's time becomes (Bool, Bool) -> Bool and we're all done!

    0 讨论(0)
  • 2021-01-12 21:06

    You could take advantage of the Any monoid and the monoid instance for functions returning monoid values:

    import Data.Monoid
    import Data.Char
    
    let normalise = filter (getAny . ((Any . isLetter) `mappend` (Any . isSpace)))
    
    0 讨论(0)
提交回复
热议问题