如何解决Haskell在函数中显示类型类
我有一个功能
mySucc :: (Enum a,Bounded a,Eq a,Show a) => a -> Maybe a
mySucc int
| int == maxBound = Nothing
| otherwise = Just $ succ int
当我想用ghci打印此函数的输出时,Haskell似乎对要使用哪个Show实例感到困惑。这是为什么? Haskell难道不应该在运行时自动解析a的类型并使用它的Show吗?
我对类型类的有限理解是,如果您提到一个类型(在我的情况下为a)并说它属于类型类(显示),那么Haskell应该自动解析该类型。这不是解决Bounded,Enum和Eq的方法吗?如果我的理解错误,请纠正我。
解决方法
Haskell是否应该在运行时自动解析a的类型并使用其
Show
?
通常来说,运行时类型不存在。编译器对您的代码进行类型检查,解决所有多态性,然后擦除类型。但这与您的主要问题正交。
我对类型类的有限理解是,如果您提到一个类型(在我的情况下为
a
)并说它属于类型类(Show
),Haskell应该自动解析该类型。
不。编译器将自动解析实例。这意味着,您不需要显式地将展示方法传递给函数。例如,代替功能
showTwice :: Show a => a -> String
showTwice x = show x ++ show x
您可以使用不使用任何类型类的函数
showTwice' :: (a -> String) -> a -> String
showTwice' show' x = show' x ++ show' x
,如果您将标准showTwice
作为第一个参数,则其用法与show
几乎相同。但是,该参数需要在每个调用站点处手动传递。 那是您可以通过使用类型类来避免的事情,但这仍然需要首先知道 type 。
(您的mySucc
实际上根本没有以任何方式使用show
,因此您最好完全省略Show a
约束。)
当您对mySucc
的呼叫出现在较大的表达式中时,类型的机会实际上也会自动推断出来。例如,mySucc (length "bla")
将使用a ~ Int
,因为length
的结果固定为Int
;或mySucc 'y'
将使用a ~ Char
。但是,如果 all 子表达式是多态的(在Haskell中,甚至数字文字都是多态的),那么编译器将没有任何指示,表明您实际上想要的类型。在这种情况下,您始终可以在参数中明确指定
> mySucc (3 :: Int)
Just 4
或结果
> mySucc 255 :: Maybe Word8
Nothing
,
您在写mySucc 1
吗?在这种情况下,您会收到错误消息,因为1
文字是Num a => a
类型的多态值。
尝试致电mySucc 1 :: Maybe Int
,它将成功。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。