如何阅读F#类型签名?

编程入门 行业动态 更新时间:2024-10-24 16:28:01
本文介绍了如何阅读F#类型签名?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧! 问题描述

我正在为F#类型签名表示法而苦苦挣扎.例如,假设您具有Fold函数:

I'm struggling with the F# type signature notation. For example let's say you have a Fold function:

let rec Fold combine acc l = ...

可能具有以下类型签名:

that may have this type signature:

('a -> 'b -> 'a) -> 'a -> list<'b> -> 'a

我会读为

具有三个参数的函数:

  • 接受'a,'b并返回a'的函数
  • 一个'a
  • "b
  • 的列表
  • a function that takes an 'a, a 'b and returns an a'
  • an 'a
  • a list of 'b

并返回一个'a.

但是,对于我的穴居人的大脑来说,将其表达为

But then it would make more sense for my cavemen brain to express it as

('a, 'b -> 'a), 'a, list<'b> -> 'a

我肯定有一个语义上的原因,为什么用箭头分隔参数的方式与函数返回类型的方式完全相同,但是以某种方式我却错过了它,并且到目前为止在书/文章中都没有找到明确的解释.每次我看到类型签名时,我都必须花很多时间来理解它.我觉得我只是缺少使解密"变得显而易见的那一小部分拼图.

I'm sure there is a semantic reason why parameters are separated with an arrow exactly the same way as the function return type, but somehow I'm missing it and didn't found a clear explanation in books/articles so far. Every time I see a type signature I have to stop quite a bit of time to understand it. I feel like I'm just missing that little piece of the puzzle that makes the "decryption" obvious.

有人可以启发我吗?

推荐答案

我确定这是语义上的原因 为什么参数用 箭头与 函数返回类型,但是我不知何故 错过了,没有找到一个明确的 到目前为止,在书籍/文章中都有解释.

I'm sure there is a semantic reason why parameters are separated with an arrow exactly the same way as the function return type, but somehow I'm missing it and didn't found a clear explanation in books/articles so far.

您正在阅读的第一个功能是正确的.对于即时解密,类型签名表示为:

You're reading of the first function is correct. For instant deciphering, type signatures are expressed like this:

val functionName = inputType1 -> inputType2 -> ... -> inputTypeN -> returnType

通常,箭头表示功能是可咖喱的.

Generally, arrow notation indicates a function is curry-able.

// val add4 : int -> int -> int -> int -> int let add4 a b c d = a + b + c + d;; // val f : (int -> int) let f = add4 1 2 3 // returns (int -> int) waiting for last argument

由于该函数是经过咖喱处理的,因此您可以在技术上这样写:

Because the function is curried, you can technically write it like this:

// val add4 : int -> int -> int -> int -> int let add4 = (fun a -> (fun b -> (fun c -> (fun d -> a + b + c + d))));; // val f : (int -> int) let f = fun x -> add4 1 2 3 x

考虑一下,add4签名与此等效:

If you think about it, the add4 signature is equivalent to this:

val add4 : int -> (int -> (int -> (int -> int) ) )

我相信我们使用箭头表示法是因为当我们显式咖喱参数时,它类似于函数的结构.

I believe we use arrow notation because it resembles the structure of the function when we explicitly curry arguments as shown above.

更多推荐

如何阅读F#类型签名?

本文发布于:2023-07-30 15:18:37,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1250578.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:类型

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!