首页>Program>source

我正在自学Haskell,我想知道以下类型签名:

Prelude> :t ($)
($) :: (a -> b) -> a -> b
Prelude>

我应该怎么解释(不是双关语)?

一个半相似的结果也令人困惑:

Prelude> :t map
map :: (a -> b) -> [a] -> [b]
Prelude>
最新回答
  • 2天前
    1 #

    我将从 map开始 .维兹威兹 函数将操作应用于列表中的每个元素.如果我有

    map
    

    然后我可以将其应用于整个 add3 :: Int -> Int add3 x = x + 3列表 使用 Int

    map
    

    所以,如果您查看类型签名

    > map add3 [1, 2, 3, 4]
    [4, 5, 6, 7]
    

    您会看到第一个参数是 map :: (a -> b) -> [a] -> [b] ,这只是一个需要 (a -> b)的函数 并返回一个 a .第二个参数是 b ,这是 [a]类型的值的列表 ,以及返回类型 a ,类型为 [b]的值的列表 .所以用简单的英文来说, 函数将函数应用于值列表中的每个元素,然后将这些值作为列表返回。

    这就是使 b 高阶函数,它将函数作为参数并对其进行填充.另一种看 map的方式 是在类型签名上添加一些括号以使其成为

    map
    

    因此,您也可以将其视为从 map转换功能的功能 到 map :: (a -> b) -> ([a] -> [b]) 进入 a的功能 到 b


    函数 [a] 具有类型

    [b]
    

    一样使用
    ($)
    

    它所做的就是将正确取为真,在这种情况下为 ($) :: (a -> b) -> a -> b ,并将其传递给left上的函数,此处为 > add3 $ 1 + 1 5 .为什么这很重要? 它具有方便的fixity或运算符优先级,使其等效于

    1 + 1
    

    因此,右侧的任何内容在传递到左侧之前都必须先用括号括起来.这对于将多个函数链接在一起非常有用:

    add3
    

    > add3 (1 + 1)
    

    因为您不必关闭括号。

  • 2天前
    2 #

    嗯,就像已经说过的, > add3 $ add3 $ add3 $ add3 $ 1 + 1 如果您只是忘记了currying并在C ++中看到它,就可以轻松理解

    > add3 (add3 (add3 (add3 (1 + 1))))
    

    但是实际上,这不仅仅是将函数应用于值! $签名之间的表观相似性 和 template<typename A, typename B> B dollar(std::function<B(A)> f, A x) { return f(x); } 实际上具有很深的类别理论含义:两者都是函子的态射行为的例子!

    $类别中 我们一直在工作,对象是类型. (这有点令人困惑,但是不用担心).态射是函数。

    最著名的(endo-)functors是具有同义类型类实例的那些.但是实际上,从数学上来说,函子只是将对象映射到对象并将词素映射到词素1的东西. map (我想是双关语!)是一个例子:它需要一个对象(即类型) Hask 并将其映射到类型 map .并且,对于任何两种类型的 A[A] ,它需要一个态射(即函数) A ,并将其映射到 B类型的相应列表函数

    这只是函子类签名操作的特例:

    A -> B
    

    数学不需要这个 [A] -> [B] 虽然有个名字.因此,还有identity functor(身份函子),该函数简单地将任何类型分配给自己.而且,每个形态本身:

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

    "身份"显然更普遍地存在,您还可以将任何类型的值映射到自己。

    fmap
    

    当然,然后可能的实现方式是

    ($) :: (a->b) -> (a->b)
    

    1心智,而不是映射对象和态射影的任何东西是一个函子...它确实需要满足函子定律。

  • 2天前
    3 #

    id :: a -> a id x = x 仅仅是功能应用.它具有 ($) = id类型的功能 ,类型为 ($)的参数 ,应用函数并返回 a->b类型的值

    a 这是一个很好的示例,说明了如何阅读函数类型签名有助于理解它. b 的第一个参数是使用 map的函数 并返回 map ,其第二个参数是 a类型的列表 . 太棒了 应用 b类型的函数 到 [a]的清单 value观.结果类型确实是 map类型 - a->b的列表 value观!

    a 可以解释为"接受一个函数和一个列表并返回另一个列表",也可以解释为"接受 [b]类型的函数 并返回 b类型的另一个函数 "。 当您以这种方式看时, (a->b)->[a]->[b] "升级" f(在此上下文中通常使用术语"提升")在列表上工作:if a->b 是将整数加倍的函数,然后是 [a]->[b] 是将列表中的每个整数加倍的函数。

    map

  • mysql:在SQL中选择/广播输出为整数
  • ios:iOS8:可以为静态单元格使用" tableviewrowHeight = UITableViewAutomaticDimension"吗?