dmw*_*w64 1 haskell typeclass ghc
我有以下问题:我定义了一个类型类,并希望将此类的类型的元组声明为实例.但我不知道如何让GHC接受这个声明.这是一个非常简单的例子:
class Test a where
elm :: a
Run Code Online (Sandbox Code Playgroud)
并且知道元组我想要做类似的事情
instance (Test a, Test b) => Test (a,b) where
elm = (elm, elm) :: (a,b)
Run Code Online (Sandbox Code Playgroud)
(实际上,我想对与矢量空间相对应的更多花哨类型类做类似的事情.)
怎么做到这一点?在此先感谢您的任何建议!
试试这个:
instance (Test a, Test b) => Test (a,b) where
elm = (elm, elm)
Run Code Online (Sandbox Code Playgroud)
这应该工作.您的代码问题是,:: (a,b)
您添加的类型注释实际上是混淆GHC而不是帮助它.问题是当GHC看到a
并且b
它认为它们代表某些任意类型时.但是你不希望它们是任意的,你希望它们与上面一行中引用的完全相同.但GHC不知道这一点.如果保留类型注释,GHC将自己确定正确的类型.或者,您可以ScopedTypeVariables
通过在文件顶部添加以下内容来启用语言扩展来更改GHC的行为:
{-# LANGUAGE ScopedTypeVariables #-}
Run Code Online (Sandbox Code Playgroud)
这将告诉GHC,只要有class
定义,顶行引用的类型变量将在其余定义的范围内.我是那些认为ScopedTypeVariables
应该默认使用的人之一,但不幸的是情况并非如此,主要是出于历史和兼容性原因.实际上,这个问题提供了一个很好的论据,为什么ScopedTypeVariables
在默认情况下关闭是违反直觉的.