当前位置: 首页 > 知识库问答 >
问题:

Haskell-函数组合(().())

艾弘义
2023-03-14
    ((<*>) . (<*>))
    --In GHCi
    :: (a1 -> a2 -> b) -> ((a1 -> a2) -> a1) -> (a1 -> a2) -> b
    :t ((<*>) .)

    ((<*>) .)
      :: Applicative f => (a1 -> f (a2 -> b)) -> a1 -> f a2 -> f b

    :t (. (<*>))
    (. (<*>))
      :: Applicative f => ((f a -> f b) -> c) -> f (a -> b) -> c

    ((<*>) . (<*>))
    --from left to right
  1. (<*>)::应用f1=>f1(a1->b1)->f1 a1->f1 b1
  2. (.)::(b->c)->(a->b)->a->c
  3. (<*>)::应用f2=>f2(a2->b2)->f2 a2->f2 b2

在2.(a->b)中,设3。F2(A2->b2)=A;因此,b应为f2 A2->f2 B2(B->c),替换为1。,bf1(A1->b1)c应为f1 A1->f1 b1

但是,b应该彼此相等,f2 a2->f2 b2=f1(a1->b1)?如何使两者在GHCi中相互适应,它似乎用A1A2代替了F(a->b),那么它是如何前进的呢?

共有1个答案

陶鸿畴
2023-03-14

据我所知,你的推理是正确的。

下一步,正如您所写的,是解决

f2 a2 -> f2 b2 = f1 (a1 -> b1)

也就是说,用前缀表示法,

(->) (f2 a2) (f2 b2) = f1 (a1 -> b1)
(->) (f2 a2) = f1
f2 b2 = a1 -> b1 = (->) a1 b1
(->) (f2 a2) = f1
f2 = (->) a1
b2 = b1
a = f2 (a2 -> b2) 
  = (->) a1 (a2 -> b2)
  = a1 -> a2 -> b2
  = a1 -> a2 -> b1

c = f1 a1 -> f1 b1
  = (->) (f2 a2) a1 -> (->) (f2 a2) b1
  = (f2 a2 -> a1) -> (f2 a2 -> b1)
  = ((->) a1 a2 -> a1) -> ((->) a1 a2 -> b1)
  = ((a1 -> a2) -> a1) -> (a1 -> a2) -> b1

a -> c =
  = (a1 -> a2 -> b1) -> ((a1 -> a2) -> a1) -> (a1 -> a2) -> b1
 类似资料:
  • 函数组合是将一个函数的输出用作另一个函数的输入的过程。在数学中,合成用表示,其中是一个函数,其输出用作另一个函数(即)的输入。 如果一个函数的输出类型与第二个函数的输入类型匹配,则可以使用这两个函数来实现函数组合。我们使用点运算符()在Haskell中实现函数组合。 看下面的示例代码。演示如何使用函数组合来计算输入数字是偶数还是奇数。 在这里,在函数中,同时调用了两个函数和。编译器将首先以作为参数

  • 函数在Haskell中起主要作用,因为Haskell是一种函数式编程语言。与其他语言一样,Haskell确实具有自己的函数定义和声明。 函数声明由函数名称,其参数列表以及其输出组成。函数定义是实际定义函数的地方。让我们看看一个添加函数的示例,以详细了解此概念。 在这里,在第一行中声明了函数,在第二行中,我们编写了实际的函数,该函数将带有两个参数并产生一个整数类型的输出。 与大多数其他语言一样,Ha

  • 到目前为止,我们已经讨论了许多类型的Haskell函数,并使用了不同的方式来调用这些函数。在本章中,将学习一些可以在Haskell中轻松使用的基本函数,而无需导入任何特殊的类。这些函数大多数都是其他高阶功能的一部分。 1. head函数 Head函数适用于列表。它返回输入参数的第一个,参数基本上是一个列表。在下面的示例中,我们传递一个包含个值的列表,并使用函数返回列表的第一个元素。 示例代码: 执

  • 我现在在学习哈斯克尔。但我正在为“类型”而挣扎。 例如,函数的类型是

  • 问题内容: 我想使用Python的某些Haskell库(例如Darcs,Pandoc),但似乎在Python中没有直接的Haskell外部函数接口。有什么办法吗? 问题答案: 只要您可以获取Python代码来调用C,就可以调用已通过FFI导出的Haskell函数 另一种方法是编写标准IPC接口,在darcs和pandoc的情况下,仅将它们称为原始可执行文件,然后解析其输出可能是可行的方法。 至于在

  • 有没有一种方法可以在Haskell中有类似于创建“构造函数别名”的东西?我的想法与类型别名类似,您可以给类型一个不同的名称,但它仍然以别名类型的方式表现。 我的用例是一个系统,其中我有一个指定的时间作为我要建模的一些对象的属性,所以。其中一些可能是“可变”时间,这意味着它可能还没有被分配一个时间,或者它拥有的时间是“可移动的”。所以。 我非常肯定我对Haskell非常了解,可以说不存在构造函数别名