代码之家  ›  专栏  ›  技术社区  ›  softshipper

fmap的参数太多

  •  2
  • softshipper  · 技术社区  · 7 年前

    第一个论点是 fmap

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

    然后我在前奏中试着做了以下几点:

    Prelude> x = fmap (\x y -> x * y)
    

    正如你所看到的,第一个参数 fmap

    fmap 上面有两个论点不是一个!

    2 回复  |  直到 5 年前
        1
  •  9
  •   sepp2k    7 年前

    Haskell实际上没有多(或少)个参数的函数。“双参数函数”实际上只是一个接受一个参数并生成另一个接受另一个参数的函数。也就是说, \x y -> x * y \x -> \y -> x * y 这个概念被称为咖喱。

    这应该解释一下你的例子中发生了什么。你的 fmap 只会变成一个 f f 函数。例如, x [1,2,3] [\y -> 1 * y, \y -> 2 * y, \y -> 3 * y] [(1*), (2*), (3*)] ).

        2
  •  2
  •   willeM_ Van Onsem    7 年前

    你有 函数编程的一个基本方面是函数可以是参数、存储到变量中等。

    属于 x ,我们得到:

    Prelude> :t x
    x :: (Functor f, Num a) => f a -> f (a -> a)
    

    现在是一个函数,它将a作为输入 Functor 具有 a 应用于该函数 ,并返回具有相同函子但应用于的类型的元素 a -> a .

    在…上 x ,例如:

    Prelude> :t x [1,4,2,5]
    x [1,4,2,5] :: Num a => [a -> a]
    

    功能列表 ,即 收件人:

    [\x -> 1*x, \x -> 4*x, \x -> 2*x, \x -> 5*x]