haskell - 如何定义该函数的类型配置文件?

标签 haskell functional-programming ml

我必须定义此函数的类型配置文件:

twice f x = f (f x);

结果应该如下,但我不太明白为什么。

('a -> 'a) -> 'a -> 'a

最佳答案

(a -> a) -> a -> a 是正确的答案。让我们把它分成几部分来找出原因。

  1. 您的函数采用两个参数:fx,因此签名将由三个部分组成 - 例如,a -> c -> d
  2. 这些参数中的第一个是一个一元函数 - 它使 a = (a -> b) (请记住,a 可以是任何类型,只要它出现即可仅在签名中出现一次)并且签名看起来像 (a -> b) -> c -> d
  3. twice 的结果与其第一个参数的结果相同 - 这使得 d = b 和签名 (a -> b) -> c -> b
  4. ftwice 的第二个参数作为其参数 - 这使得 c = a 且签名如下所示: ( a -> b) -> a -> b
  5. twice 应用于其自己的输出,这意味着 a = b - 这使得最终签名 (a -> a) -> a -> 一个

关于haskell - 如何定义该函数的类型配置文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39210584/

相关文章:

haskell - 如何在默认情况下启用语言扩展/编译指示项目范围?

javascript - 在不使用返回值的情况下执行映射操作是反模式吗?

sml - 使用 foldl/foldr 插入函数

ocaml - ML 系列编译器是否对尾调用进行了任何复杂的优化?

haskell - 编译器可以进行数学推导/证明吗?

haskell - 在 haskell 中查找类型同义词

mysql - 在 haskell 中使用简单的 mysql 的 Scotty api

haskell - 启动一个 yesod 网络应用程序

MATLAB:多次从人口中随机抽样?

c++ - Maybe 和 Either 单子(monad)、短路和性能