zoukankan      html  css  js  c++  java
  • fmap为什么可以用function作为第二个参数

    看看fmap的类型

    fmap :: Functor f => (a -> b) -> f a -> f b

    很明显的,第一个参数是function,第二个参数是functor的一个instance

    但是我们这么写

    ghci> let f = (*5)   
    ghci> let g = (+3) 
    ghci> (fmap f g) 8

    而且最后得到55

    看到这个当时我和我的小伙伴们都惊呆了!

    为毛啊,明明是一个 x -> y 的function啊,为毛可以!!!

    后来经过九瓜老师的点拨

    a + b我们可以看作 (+) a b

    同理 a -> b就是 (->) a b

    Int -> Int 可以被看作 (->) Int Int,((->) Int) 可以是 Functor

    so,我们来看看fmap

    (a -> b) -> f a -> f b

    我们把f替换成((->) r)

    (a -> b) -> ((->) r a) -> ((->) r b)

    继续把(->)r x替换成 r -> x,得到

    (a -> b) -> (r -> a) -> (r -> b)

    很眼熟有木有!不就是function composition么..

    翻看(->r)的instance也是这么回事

    instance Functor ((->) r) where   
        fmap = (.)
    

      

  • 相关阅读:
    System 类的使用
    StringBuffer 与 StringBuilder类的使用
    String 类 的 使用
    多线程
    音乐播放
    数据库
    表示图编辑
    UITextView(2)
    UITextView
    tarBar
  • 原文地址:https://www.cnblogs.com/x1957/p/3193284.html
Copyright © 2011-2022 走看看