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

如何在Haskell中部分定义函数签名?

岳玉堂
2023-03-14
fn :: [a] -> Int
fn = (2 *) . length
fn list = (2 * length list) :: Int
fn list = 2 * length (list :: [Char])
fnSig = undefined :: [Char] -> a
fn | False = fnSig
   | True  = (* 2) . length
fn :: [Char] -> a
fn = (2 *) . length
fn :: [Char] -> _
fn = (2 *) . length

@ganeshsittampalam在下面的一条评论中提出了一个重要的观点。我正在寻找“一个中途之家之间没有类型签名在所有和必须给一个精确的”。所以,我不是在寻找一个基于类型类的答案,我只是想让GHC为我的函数的未指定(或未完全限制)类型填充空白处。

是的,像这样的...

fn list = 2 * length list
  where
    _ = list :: [Char]

...可以工作,但仅限于参数,且函数不是无点的。是否有一种方法可以将这种技术应用于无点函数或返回值?

fn = (2 *) . length
  where
    _ = fn `asTypeOf` (undefined :: [Char] -> a)
    _ = fn `asTypeOf` (undefined :: a -> Int)
    _ = fn `asTypeOf` (undefined :: a -> b)
    _ = fn `asTypeOf` (undefined :: a)

@Rhymoid,如果你也喜欢的话,请把它加到你的答案里。:)

共有1个答案

包修贤
2023-03-14

很抱歉自我推销,但恰恰这一特点是博士最近一篇论文的主题。学生Thomas Winant,我自己,Frank Piessens和Tom Schrijvers,最近由Thomas在PADL 2014研讨会上介绍。全文见这里。这是一个在其他一些语言中已经存在的特性,但与Haskell GADTs等特性的交互使它足够有趣,可以计算出细节。

Thomas正在为GHC做一个实现。自论文撰写以来,它有了进一步的改进,但是在GHC中实现“通配符约束”在技术上比我们预期的要难一些。我们期望能够进一步工作,并联系GHC开发人员,以获得它的采用,但这是否会发生可能取决于有多少人愿意在Haskell的功能...

更新14-4-2015:经过Thomas的大量工作以及SPJ和其他GHC人员的输入,部分类型签名已经在GHC 7.10中发布。Thomas Winant写了一篇关于如何使用它们的介绍性博客文章。

 类似资料:
  • 我想出了这两个: 我的例子正确地说明了这个练习吗? 给定两个参数: null null 我在SO上看到了一些类似的问题(比如,这个问题),这个问题几乎是我要找的,但不完全是(我只是在找函数的例子,没有别的--没有应用性,没有单子)。

  • 我觉得我的知识的函数式编程是有点缺乏所以我决定看看网上并按照教程得到更好的当我凸轮通过它的状态在第一页 “假设您有一个不可变的数字列表xs=[1,2,3,4,5,6,7,8]和一个函数doubleMe,该函数将每个元素乘以2,然后返回一个新列表。如果我们想用命令式语言将列表乘以8,并执行doubleMe(doubleMe(xs)))),它可能会通过列表一次,复制一份,然后返回。然后,它将再次通过列

  • 如果软件已经安装了旧版本,我需要Inno Setup生成的安装程序在安装之前删除某些文件。 我试图通过比较版本号(下面的自定义函数)来做到这一点,但是在编译时,Inno Setup生成了一个错误: [ISPP]未声明的标识符:“获取安装版本”。 Inno安装脚本相关摘录如下: 作为Inno Setup的新手,这当然是一个微不足道的问题,但在论坛上找不到答案。因此,问题是:如何从部分正确调用函数?

  • 问题内容: 有没有一种方法可以将一个函数定义为在一个类中是全局的(或者,实际上是在另一个函数中)?类似于定义全局变量。 问题答案: 将函数添加到当前名称空间,就像将添加任何其他名称一样。这意味着您可以在函数或方法中使用关键字: 同样适用于类主体或方法: 区别将在导入时执行顶级类主体时立即定义。 像您的所有用途一样,您可能想重新思考问题并找到另一种解决方法。例如,您可以 返回 如此创建的函数。 演示

  • 我正在尝试编写更长的函数:[a]- 在我为它提供一个无限的列表之前(更长[1..]例如,10),它将陷入某种无限循环,无法完成运行。所以问题是,有没有一种方法可以定义它,如果它得到一个无限列表,它只会返回True,而不会试图计算整个结果?提前谢谢

  • 函数在Haskell中起主要作用,因为Haskell是一种函数式编程语言。与其他语言一样,Haskell确实具有自己的函数定义和声明。 函数声明由函数名称,其参数列表以及其输出组成。函数定义是实际定义函数的地方。让我们看看一个添加函数的示例,以详细了解此概念。 在这里,在第一行中声明了函数,在第二行中,我们编写了实际的函数,该函数将带有两个参数并产生一个整数类型的输出。 与大多数其他语言一样,Ha