gpt4 book ai didi

f# - 如何阅读 F# 类型签名?

转载 作者:行者123 更新时间:2023-12-03 23:17:53 25 4
gpt4 key购买 nike

我正在为 F# 类型签名表示法而苦苦挣扎。例如,假设您有一个折叠功能:

let rec Fold combine acc l =
...

可能具有此类型签名:
('a -> 'b -> 'a) -> 'a -> list<'b> -> 'a

我会读为

具有三个参数的函数:
  • 一个函数,接受一个'a,一个'b并返回一个'
  • 一个'a
  • 'b
  • 的列表

    并返回一个'a。

    但是,对于我的穴居人大脑来说,将其表达为
    ('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.



    您正在阅读的第一个功能是正确的。对于即时解密,类型签名表示如下:
    val functionName = inputType1 -> inputType2 -> ... -> inputTypeN -> returnType

    通常,箭头符号表示函数是可 curry 的。
    // 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

    因为函数是柯里化(Currying)的,所以技术上你可以这样写:
    // 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签名等价于:
    val add4 : int -> (int -> (int -> (int -> int) ) )

    我相信我们使用箭头表示法,因为当我们显式地对参数进行柯里化(Currying)时,它类似于函数的结构,如上所示。

    关于f# - 如何阅读 F# 类型签名?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6470256/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com