【问题标题】:Could functions be instances of classes in Haskell函数可以是 Haskell 中类的实例吗
【发布时间】:2012-12-10 21:27:49
【问题描述】:
class A a
instance A (Int -> Float)

不起作用并且

class B b
instance B Int

作品 如果将 Haskell 中的函数作为第一个类,并且 (Int -> Float) 无疑是一种类型,尽管它不是 (*) 具体类型,为什么函数不能是类的实例

【问题讨论】:

    标签: class function haskell types instance


    【解决方案1】:

    使用 FlexibleInstances 扩展,您可以做到这一点:

    {-# LANGUAGE FlexibleInstances #-}
    
    module TestFlexibleInstances where
    
    class A a
    
    instance A (Int -> Float)
    

    【讨论】:

    • 它确实有效,我怎么知道一些问题是由于没有语言扩展?
    • @user1926094 GHC 在尝试instance Foo (Int -> Float) where ... 时给出的错误消息应该包含(在不太旧的 GHC 中)FlexibleInstances 的建议。
    • 我确实发现错误消息包含“如果你想禁用它,请使用 -XFlexibleInstances”,但我只在 shell 中编译时将其作为一个选项。现在我意识到它也是一个语言扩展
    【解决方案2】:

    是的,函数类型在 Haskell 中不是很特殊:

    module Test where
    
    instance Show (a -> b) where
        show _ = "(function)"
    

    正如 shk 在他的回答中指出的那样,如果您想修复域或范围的类型,您将需要像 FlexibleInstances 这样的扩展——但这与函数类型无关,其他类型需要Maybe Int 之类的构造函数应用程序也是如此。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-21
      • 1970-01-01
      • 2014-04-03
      • 1970-01-01
      • 2012-03-29
      相关资源
      最近更新 更多