繁体   English   中英

在haskell中显示约束类型

Show Constraint type in haskell

提示:本站收集StackOverFlow近2千万问答,支持中英文搜索,鼠标放在语句上弹窗显示对应的参考中文或英文, 本站还提供   中文繁体   英文版本   中英对照 版本,有任何建议请联系yoyou2525@163.com。

我正在尝试使用show function打印到zerone的控制台值,但是我做不到。 这是我的代码:

{-# LANGUAGE NoMonomorphismRestriction #-}

import Control.Arrow
import Data.List
import qualified Data.Map as M
import Data.Function

class Eq a => Bits a where
    zer :: a
    one :: a

instance Bits Int where
    zer = 0
    one = 1

instance Bits Bool where
    zer = False
    one = True

instance Bits Char where
    zer = '0'
    one = '1'

我正在尝试使用函数show将zer或一个转换为字符串。 所以我尝试了:

k = zer
show k

但是我得到这个错误

<interactive>:10:1: error:
    • Ambiguous type variable ‘a0’ arising from a use of ‘show’
      prevents the constraint ‘(Show a0)’ from being solved.
      Probable fix: use a type annotation to specify what ‘a0’ should be.
      These potential instances exist:
        instance (Show k, Show a) => Show (M.Map k a)
          -- Defined in ‘containers-0.5.7.1:Data.Map.Base’
        instance Show Ordering -- Defined in ‘GHC.Show’
        instance Show Integer -- Defined in ‘GHC.Show’
        ...plus 24 others
        ...plus 11 instances involving out-of-scope types
        (use -fprint-potential-instances to see them all)
    • In the expression: show zer
      In an equation for ‘it’: it = show zer

所以我试图创建实例来显示。 所以我将其添加到我的代码中:

instance (Show a) => Show (Bits a) where
    show zer = "0"
    show one = "1"

但是我又遇到一个错误

main.hs:25:28: error:
    • Expected a type, but ‘Bits a’ has kind ‘Constraint’
    • In the first argument of ‘Show’, namely ‘Bits a’
      In the instance declaration for ‘Show (Bits a)’

你能告诉我我做错了什么吗?

1 个回复

您试图使一个成为一个的实例,而不是使一个类型成为一个的实例。 相比:

Show a => Show (Bits a) -- Invalid

Show a => Show (Maybe a) -- Valid

其中Maybe是数据类型,而Bits是类名称。


我认为不可能表达“任何具有Bits实例的实例都具有Show实例的实例”,因为它可能导致实例重叠 :如果您可以定义类似的实例 ,则在使用show :: Int -> String the编译器不知道是使用Show Int的Prelude实例,还是使用Int作为Bits的实例定义的show

一个麻烦的解决方法可能是强制执行“另一个方向”:每个Bits实例必须是Show的实例,这将允许您使用a Show实例,而不是您自己的Show实例:

class (Show a, Eq a) => Bits a where
    zer :: a
    one :: a

main = print (zer :: Int)

尽管这需要显式的类型签名来解决呼叫站点上zer类型的歧义。

2 你能部分约束Haskell中的类型吗?

是否可以为包含“空白”的Haskell值提供类型签名以填充类型推断算法? 背景的极为人为的例子: 这有效。 使用isJust m在b约束的类型m是Maybe &lt;something&gt; ,和m的定义约束的类型m为&lt;something&gt; (Char, ((Str ...

3 Haskell类型类中的异常约束

我有个问题。 我试图写下用于文件系统管理的类类型。 我从一个简单的类开始: 有功能cd(在目录上移动)。 它尝试使用setCurDir(需要实现)更改目录,如果出现问题,它将调用catchError函数。 我想创建两个实例:用于IO和我的“玩具” FileSystem数据类。 对于IO,它将 ...

7 Haskell类型约束

我正在努力使用haskell类型系统。 基本上我要做的是定义一个代表monad的数据结构(参见代码示例中的Ast数据类型)(它可能是其他东西)。 此类型由a参数化,并且没有约束。 我的问题是当我想内省这种类型时,我可能需要对type参数进行一些约束,例如: 这会产生以下错误: ...

8 Haskell“不”类型约束

我试图以归纳方式定义一对类实例。 那是: 第一个实例确定基本操作,秒递归调用foo。 有没有办法做到这一点? 一个很好的例子是扁平化列表,在第一种情况下它是标识函数,在第二种情况下它是concat的递归应用。 ...

9 Haskell 类型级别约束

我很好奇是否可以在 Haskell 中编写这样的(伪代码): 使(在类型级别)无法创建如下内容: 或者应该使用一种时钟构建器来检查并创建有效的时钟时间? ...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2021 STACKOOM.COM