热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

键入签名错误Haskell

如何解决《键入签名错误Haskell》经验,为你挑选了1个好方法。



1> Jon Purdy..:

你想要的签名是Double -> Double.

Double d => d -> d说"我接受任何类型的值d,并返回相同类型的值,前提是它d具有一个名为Double" 的类型类的实例.编译器正在寻找一个被调用的类型类,Double但是没有这样的类型类; 相反,它找到一个叫做的类型Double,给出错误.

使用某些扩展(例如TypeFamiliesGADTs),您可以像这样编写此类型:

(d ~ Double) => d -> d

这表示"我接受任何类型的值d,并返回相同类型的值,前提是d它等于Double".这只是一种迂回的说法Double -> Double; 如果你编写这种类型的函数,编译器实际上会将它扩展为Double -> Double:

> :set -XTypeFamilies
> let f :: (d ~ Double) => d -> d; f x = x
> :t f
f :: Double -> Double

从技术上讲,你遇到的错误是一种错误 - 类型是"类型的类型",用于检查诸如为类型提供正确数量的类型参数之类的事情.因为你给了一个类型参数Double,所以GHC推断它应该是一个类型类Eq或者Ord类型为1的类型(kind * -> Constraint),但它Double是一个不带参数(kind *)的普通类型.您可以使用:kindor :k命令查看GHCi中常见类型和类型类的种类,以便更好地理解它们:

> :k Double
Double :: *

> :k Maybe
Maybe :: * -> *

> :k Maybe Double
Maybe Double :: *

> :k Eq
Eq :: * -> Constraint


推荐阅读
author-avatar
1471446448_9c38cc
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有