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

Haskell高阶函数型

卜飞鸣
2023-03-14

我现在在学习哈斯克尔。但我正在为“类型”而挣扎。

  1. 例如,f函数的类型是

fg(x,y)=gxy

(a)-

h f g x y=f(g x y)x

(a)-

我如何理解如何猜测函数的类型?


共有1个答案

王俊楚
2023-03-14

我会带你看第一个:希望这能给你足够的想法,让你自己找出第二个。

所以函数定义是:

f g (x,y)= g x y

f是我们感兴趣的函数,从上面我们可以看到——实际上就是从左手边——它有两个参数:g和元组(x,y)。让我们使用一些类型变量:

  • 我们将使用a表示g
  • b用于x
  • c用于y
  • 当给定两个参数时,f输出的类型

这给了我们

f :: a -> (b, c) -> d

此外,这是我们可以从=左边获得的所有信息。我们可以通过查看右侧的gxy了解更多信息,它必须是d类型。

表达式g x y本身告诉我们g是一个可以接受两个参数的函数。此外,我们已经为这些参数及其返回值分配了类型(因为这与f g(x,y)输出的值相同,我们已经说过类型为d)。

写出来,我们发现g的类型只是b-

f :: (b -> c -> d) -> (b, c) -> d

如果我们在意的话,我们现在可以重命名类型变量,这样就可以匹配您得到的签名——但希望您可以看到它们是相同的,而无需这样做。

正如我所说,尽管第二个练习涉及的内容稍微多一些,但可以使用完全相同的逻辑来解决。

 类似资料:
  • Haskell 中的函数可以接受函数作为参数也可以返回函数作为结果,这样的函数就被称作高阶函数。高阶函数可不只是某简单特性而已,它贯穿于 Haskell 的方方面面。要拒绝循环与状态的改变而通过定义问题"是什么"来解决问题,高阶函数必不可少。它们是编码的得力工具。 Curried functions 本质上,Haskell 的所有函数都只有一个参数,那么我们先前编那么多含有多个参数的函数又是怎么回

  • 简介 高阶函数(Higher Order Function)是一种以函数为参数的函数。它们都被用于映射(mapping)、过滤(filtering)、归档(folding)和排序(sorting)表。高阶函数提高了程序的模块性。编写对各种情况都适用的高阶函数与为单一情况编写递归函数相比,可以使程序更具可读性。比如说,使用一个高阶函数来实现排序可以使得我们使用不同的条件来排序,这就将排序条件和排序过

  • 高阶函数英文叫Higher-order function。那么什么是高阶函数? JavaScript的函数其实都指向某个变量。既然变量可以指向函数,函数的参数能接收变量,那么一个函数就可以接收另一个函数作为参数,这种函数就称之为高阶函数。 一个最简单的高阶函数: function add(x, y, f) { return f(x) + f(y); } 当我们调用add(-5, 6, M

  • 高阶函数英文叫Higher-order function。什么是高阶函数?我们以实际代码为例子,一步一步深入概念。 变量可以指向函数 以Python内置的求绝对值的函数abs()为例,调用该函数用以下代码: >>> abs(-10) 10 但是,如果只写abs呢? >>> abs <built-in function abs> 可见,abs(-10)是函数调用,而abs是函数本身。 要获得函数

  • 高阶函数英文叫Higher-order function。什么是高阶函数?我们以实际代码为例子,一步一步深入概念。 变量可以指向函数 以Python内置的求绝对值的函数abs()为例,调用该函数用以下代码: >>> abs(-10) 10 但是,如果只写abs呢? >>> abs <built-in function abs> 可见,abs(-10)是函数调用,而abs是函数本身。 要获得函数

  • Rust 提供了高阶函数(Higher Order Function, HOF)。执行一个或多个函数来产生一个用处更大的函数。HOF 和惰性迭代器(lazy iterator)给 Rust 带来了函数式的风格(英文原文:HOFs and lazy iterators give Rust its functional flavor.)。 fn is_odd(n: u32) -> bool {