从上下文中猜测Num的正确实例

u

认为:

import Data.Int (Int64)

data Unknown

class Meh a where
    meh :: a -> String
instance Meh Int64 where
    meh = show
instance Meh Unknown where
    meh _ = "Unknown"

很明显,meh只能取Int64Unknown

但是我们都知道

meh 1

会导致错误(原义'1'不会引起(Num a0)的实例),因为1isNum a => a并且编译器不知道Num它应该是哪个实例

但是,(从逻辑上)应该可以推断1为an,Int64因为它将传递给mehmeh并且只能采用anInt64或an Unknown换句话说,应该有可能计算出的“交叉点”NumMeh,并决定哪个实例1是。

所以我的问题是:你知不知道这使得它可以写任何方式(编译器扩展,代码的解决办法,任何东西)meh 1,其中1被正确地推断是Int64不添加类型签名或添加专门的功能呢?

phadej

在GHC 7.8.3中尝试您的示例时

>>> meh 1

我得到:

<interactive>:2:1:
    No instance for (Meh a0) arising from a use of ‘meh’
    The type variable ‘a0’ is ambiguous
    Note: there are several potential instances:
      instance Meh Unknown -- Defined at Meh.hs:9:10
      instance Meh Int64 -- Defined at Meh.hs:7:10
    In the expression: meh 1
    In an equation for ‘it’: it = meh 1

<interactive>:2:5:
    No instance for (Num a0) arising from the literal ‘1’
    The type variable ‘a0’ is ambiguous
    Note: there are several potential instances:
    ...

这是因为编译器尝试进行类型检查:

>>> meh (fromInteger (1 :: Integer))

为此,您会收到类似的错误:

<interactive>:4:1:
    No instance for (Meh a0) arising from a use of ‘meh’
    The type variable ‘a0’ is ambiguous
    Note: there are several potential instances:
      instance Meh Unknown -- Defined at Meh.hs:9:10
      instance Meh Int64 -- Defined at Meh.hs:7:10
    In the expression: meh (fromInteger (1 :: Integer))
    In an equation for ‘it’: it = meh (fromInteger (1 :: Integer))

<interactive>:4:6:
    No instance for (Num a0) arising from a use of ‘fromInteger’
    The type variable ‘a0’ is ambiguous
    Note: there are several potential instances:

类型类是开放的。没有人可以限制其他人定义:

newtype MyInt = MyInt Int deriving (Num)
instance Meh MyInt where
   meh = ...

然后,即使在您的示例中meh 1也可以将其解析为(meh :: Int64 -> String) 1,但通常无法。Meh由于实例是全局的,因此诸如“但基于作用域中可见实例”之类的参数在Haskell中实际上不起作用。


如果定义data(已关闭),则可以使用{-# LANGUAGE OverloadedStrings #-}

data Meh = MehInt Int64 | MehString String

instance IsString Meh where
   fromString = MehString

然后

"foo" :: Meh

将按照GHC“将看到的”进行编译

fromString "foo" :: Meh

同样,您可以定义不完整的Num实例,仅fromInteger定义一个。但是我个人不喜欢不完整的实例,尽管这种情况在定义eDSL时很方便。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

从上下文中获取活动?

来自分类Dev

如何从上下文中获取片段对象

来自分类Dev

如何从上下文中获取应用程序

来自分类Dev

无法从上下文中解构对象的属性

来自分类Dev

Hybris:如何从上下文中获取枚举的名称?

来自分类Dev

Coq:从上下文中导出参数

来自分类Dev

StrutsSpringTestCase-几个上下文-如何按顺序正确实例化它们

来自分类Dev

无法从从上下文感知中检索到的应用程序上下文中正确生成Bean

来自分类Dev

如果调用方法然后对结果执行.Where(),如何执行“从上下文中的tbl返回(从上下文中的[表名]选择tbl]”)?

来自分类Dev

在单个Camel上下文中的单独路由实例

来自分类Dev

TypeScript在静态上下文中从类创建新实例

来自分类Dev

在UI线程上下文中执行代码的正确方法?

来自分类Dev

Angular 在正确的上下文中执行传递的方法引用

来自分类Dev

如何使用LINQ从上下文中获取具有公共属性的对象数

来自分类Dev

从上下文中删除时,jQuery函数将无法运行

来自分类Dev

如何从上下文中获取视图中对象的ID?

来自分类Dev

使用useEffect在页面加载时从上下文中获取数据

来自分类Dev

SAPUI5如何从上下文中按值获取对象?

来自分类Dev

从上下文中删除时,jQuery函数将无法运行

来自分类Dev

尽管变量确实存在,但在当前上下文中不存在

来自分类Dev

我的应用程序不想重新渲染,但是上下文中的列表确实

来自分类Dev

尽管变量确实存在,但在当前上下文中不存在

来自分类Dev

如何从上下文获取FREContext?

来自分类Dev

无法从上下文访问请求

来自分类Dev

地图查看器从上下文代理实例检索POI

来自分类Dev

如何使用dialogflow实现从上下文中提取参数以进行列表响应

来自分类Dev

请求上下文中的ServiceStack HasPermission

来自分类Dev

TypeScript和“ this”上下文中的KeyListener

来自分类Dev

单值上下文中的多值

Related 相关文章

  1. 1

    从上下文中获取活动?

  2. 2

    如何从上下文中获取片段对象

  3. 3

    如何从上下文中获取应用程序

  4. 4

    无法从上下文中解构对象的属性

  5. 5

    Hybris:如何从上下文中获取枚举的名称?

  6. 6

    Coq:从上下文中导出参数

  7. 7

    StrutsSpringTestCase-几个上下文-如何按顺序正确实例化它们

  8. 8

    无法从从上下文感知中检索到的应用程序上下文中正确生成Bean

  9. 9

    如果调用方法然后对结果执行.Where(),如何执行“从上下文中的tbl返回(从上下文中的[表名]选择tbl]”)?

  10. 10

    在单个Camel上下文中的单独路由实例

  11. 11

    TypeScript在静态上下文中从类创建新实例

  12. 12

    在UI线程上下文中执行代码的正确方法?

  13. 13

    Angular 在正确的上下文中执行传递的方法引用

  14. 14

    如何使用LINQ从上下文中获取具有公共属性的对象数

  15. 15

    从上下文中删除时,jQuery函数将无法运行

  16. 16

    如何从上下文中获取视图中对象的ID?

  17. 17

    使用useEffect在页面加载时从上下文中获取数据

  18. 18

    SAPUI5如何从上下文中按值获取对象?

  19. 19

    从上下文中删除时,jQuery函数将无法运行

  20. 20

    尽管变量确实存在,但在当前上下文中不存在

  21. 21

    我的应用程序不想重新渲染,但是上下文中的列表确实

  22. 22

    尽管变量确实存在,但在当前上下文中不存在

  23. 23

    如何从上下文获取FREContext?

  24. 24

    无法从上下文访问请求

  25. 25

    地图查看器从上下文代理实例检索POI

  26. 26

    如何使用dialogflow实现从上下文中提取参数以进行列表响应

  27. 27

    请求上下文中的ServiceStack HasPermission

  28. 28

    TypeScript和“ this”上下文中的KeyListener

  29. 29

    单值上下文中的多值

热门标签

归档