Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/34.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Haskell 表示函数的类型类_Haskell_Typeclass - Fatal编程技术网

Haskell 表示函数的类型类

Haskell 表示函数的类型类,haskell,typeclass,Haskell,Typeclass,如果这是一个愚蠢的问题,请原谅我,但是是否存在一个表示所有函数的typeclass?比如说,我有一个这样的类型 data Foo a = Thing a instance (Show a) => Show (Foo a) where show (Thing a) = show a 我想显示东西(\x->1)。也许对该方法进行某种反思,以漂亮地打印一些关于此的元数据 尝试它,我得到以下错误 > Thing (\x -> 1) <interactive>

如果这是一个愚蠢的问题,请原谅我,但是是否存在一个表示所有函数的typeclass?比如说,我有一个这样的类型

data Foo a = Thing a 

instance (Show a) => Show (Foo a) where
    show (Thing a) = show a
我想显示
东西(\x->1)
。也许对该方法进行某种反思,以漂亮地打印一些关于此的元数据

尝试它,我得到以下错误

> Thing (\x -> 1)

<interactive>:113:1:
    No instance for (Show (t0 -> a0)) arising from a use of `print'
    Possible fix: add an instance declaration for (Show (t0 -> a0))
    In a stmt of an interactive GHCi command: print it

<interactive>:113:14:
    No instance for (Num a0) arising from the literal `1'
    The type variable `a0' is ambiguous
    Possible fix: add a type signature that fixes these type variable(s)
    Note: there are several potential instances:
      instance Num Double -- Defined in `GHC.Float'
      instance Num Float -- Defined in `GHC.Float'
      instance Integral a => Num (GHC.Real.Ratio a)
        -- Defined in `GHC.Real'
      ...plus 11 others
    In the expression: 1
    In the first argument of `Thing', namely `(\ x -> 1)'
    In the expression: Thing (\ x -> 1)
>东西(\x->1)
:113:1:
没有因使用“print”而产生的(Show(t0->a0))实例
可能的修复方法:为(Show(t0->a0))添加实例声明
在交互式GHCi命令的stmt中:打印它
:113:14:
没有由文字“1”产生的(Num a0)实例
类型变量“a0”不明确
可能的修复:添加修复这些类型变量的类型签名
注意:有几个潜在的例子:
实例Num Double——在“GHC.Float”中定义
实例Num Float——在“GHC.Float”中定义
实例积分a=>Num(GHC.Real.Ratio a)
--在“GHC.Real”中定义
…加上其他11个
在表达式中:1
在'Thing'的第一个参数中,即`(\x->1)'
在表达式中:Thing(\x->1)
这很有意义,因为对于
t0->a0
没有
show
的实例,但是我不知道如何描述这个类型类的实例


这不是为了制作任何东西,我只是在和哈斯克尔混日子,好奇我能做什么不能做什么。

既然你的目标就是玩得开心,你可能会喜欢。不过,对于更严肃的目标,您可能希望等到Cloud Haskell项目取得一些进展,该项目的部分目的是找到一种序列化和反序列化函数的方法,以便它们可以跨机器迁移。

因为您的目标只是玩得开心,您可能会喜欢。不过,为了实现更重要的目标,您可能需要等待Cloud Haskell项目取得一些进展,该项目的部分目的是找到一种序列化和反序列化函数的方法,以便可以跨机器迁移它们。

如果您需要占位符实例,以便可以显示函数,则导入
Text.show.functions
。酷,谢谢我知道我遗漏了什么。函数不能是
Show
的实例。这看起来很容易,但对于编译器来说,在编译、优化和组装之后,信息很难获得。甚至可以在运行时创建新函数,因此这会使事情变得非常复杂。您可以使用模板haskell来管理它,该模板将生成类型为
data Func a=Func a String
的值,其中可以将函数定义插入字符串中,并将函数本身插入
a
槽中。然后,您可以为它创建一个简单的
Show
实例。但是这很难写。好的,很酷,谢谢。这是有道理的,我不确定这是否可能。感谢您的回答他们使用
Control.Category
为函数添加名称,并使用
组合它们。或者,您可以使用
Data.Data
typeOf
创建一个
Show
实例,该实例只告诉您函数的类型,但对多态函数不起作用。如果您想要一个占位符实例以便可以显示函数,请导入
Text.Show.functions
。很酷,谢谢!我知道我遗漏了什么。函数不能是
Show
的实例。这看起来很容易,但对于编译器来说,在编译、优化和组装之后,信息很难获得。甚至可以在运行时创建新函数,因此这会使事情变得非常复杂。您可以使用模板haskell来管理它,该模板将生成类型为
data Func a=Func a String
的值,其中可以将函数定义插入字符串中,并将函数本身插入
a
槽中。然后,您可以为它创建一个简单的
Show
实例。但是这很难写。好的,很酷,谢谢。这是有道理的,我不确定这是否可能。感谢您的回答他们使用
Control.Category
为函数添加名称,并使用
组合它们。或者,您可以使用
Data.Data
typeOf
创建一个
Show
实例,它只告诉您函数的类型,但这对多态函数不起作用。是否有什么魔法可以让我的计算机死机之前打印一个Int64->Int64?另外,我认为OP(以及我)希望展示源代码,就像在R或Scheme中一样。有办法吗?克劳德·哈斯克尔@没错,为了能够序列化和反序列化代码,您必须等待CloudHaskell。或者定义自己的语言并嵌入其中。wiki页面上说Cloud Haskell已经发布,鼓励使用。此外,如果程序员愿意命名可能显示的所有“基本”函数和组合符(但不是所有函数),静态标签可能会起作用。是否有某种魔力可以在我的计算机死机之前打印Int64->Int64?另外,我认为OP(以及我)希望展示源代码,就像在R或Scheme中一样。有办法吗?克劳德·哈斯克尔@没错,为了能够序列化和反序列化代码,您必须等待CloudHaskell。或者定义自己的语言并嵌入其中。wiki页面上说Cloud Haskell已经发布,鼓励使用。此外,如果程序员愿意命名可能显示的所有“基本”函数和组合符(但不是所有函数),静态标签可能会起作用