【问题标题】:How do I get the type signature of the range function in Haskell?如何在 Haskell 中获取 range 函数的类型签名?
【发布时间】:2013-02-01 06:28:49
【问题描述】:

Haskell 中的许多由 Haskell 中的特殊字符组成的函数都是中缀函数。其中包括*+==/ 等。要获取这些函数的类型签名,请将函数放在括号中并执行:t,如下所示:

GHCi> :t (==)
(==) :: Eq a => a -> a -> Bool

我想尝试获取范围函数的类型签名[a..a],但似乎这个函数是中缀的,但只能在列表[]中使用。我尝试了以下所有方法,但都没有奏效:

GHCi> :t (..)
<interactive>:1:2: parse error on input `..'
GHCi> :t ([..])
<interactive>:1:3: parse error on input `..'
GHCi> :t [..]
<interactive>:1:2: parse error on input `..'
GHCi> :t ..
<interactive>:1:1: parse error on input `..'

有人知道如何获取范围函数的类型签名吗?

【问题讨论】:

    标签: haskell types


    【解决方案1】:

    .. 不是函数,它实际上是语法糖。它被翻译成以下几个函数之一:enumFromenumFromThenenumFromToenumFromThenTo

    它不可能是一个正常的函数,因为它有四种以不同方式工作的形式。也就是说,这四个都是有效的:

    [1..]     -- enumFrom 1
    [1,2..]   -- enumFromThen 1 2
    [1..10]   -- enumFromTo 1 10
    [1,2..10] -- enumFromThenTo 1 2 10
    

    这些表单分别使用了我提到的四个函数。

    如果它只是一个普通的运算符,1.. 会给你一个部分应用的函数;相反,它会生成一个列表。此外,对于普通函数,[1,2..10] 表示法将被解析为 [1,(2..10)],实际上它全部变成一个函数,将所有三个数字作为参数。

    这些函数都是Enum 类的一部分,因此.. 表示法适用于属于它的任何类型。例如,您可以写[False ..] 并获取列表[False, True]。 (不幸的是,由于当前的解析不明确,您不能编写 [False..],因为它会假定 False 是一个模块。)

    【讨论】:

      【解决方案2】:

      尝试使用 lambda。

      > :t \x y -> [x..y]
      

      符号只是 enumFromenumFromTo 的语法糖,因此它实际上没有常规类型。

      【讨论】:

        猜你喜欢
        • 2018-01-03
        • 2021-01-23
        • 1970-01-01
        • 2023-01-20
        • 2011-06-13
        • 1970-01-01
        • 2020-11-06
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多