首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何将此更改为主体类型应该等于参数类型?

如何将此更改为主体类型应该等于参数类型?
EN

Stack Overflow用户
提问于 2016-09-30 17:07:35
回答 2查看 64关注 0票数 0

我试图使用类型类型将字典传递给一个函数,其中字典的值是由函数的两种类型的参数类型唯一指定的。

当我编译这段代码时,我会在注释中得到错误消息。

如何修改此代码以避免这种模糊性?我希望身体中的a和b类型与形式参数中的类型相同。

代码语言:javascript
复制
{-# LANGUAGE MultiParamTypeClasses#-}

class C a b where
  a :: a
  b :: b

f :: C a b => a -> b
f a = b


-- $ runhaskell toy2.hs
-- toy2.hs:8:7:
--     Could not deduce (C a0 b) arising from a use of ‘b’
--     from the context (C a b)
--       bound by the type signature for f :: C a b => a -> b
--       at toy2.hs:7:6-20
--     The type variable ‘a0’ is ambiguous
--     Relevant bindings include f :: a -> b (bound at toy2.hs:8:1)
--     In the expression: b
--     In an equation for ‘f’: f a = b

那么使用就像

代码语言:javascript
复制
instance C String Double where
  a = "foo"
  b = 42.0

代码语言:javascript
复制
f "bar" = 42.0
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-09-30 18:30:04

使用显式类型参数。不过,我不相信这是个好办法。

代码语言:javascript
复制
{-# LANGUAGE AllowAmbiguousTypes, TypeApplications, 
             ScopedTypeVariables, MultiParamTypeClasses #-}

class C a b where
   getA :: a
   getB :: b

foo :: forall a b. C a b => a -> b
foo _ = getB @ a

instance C Int Char where
   getA = 3
   getB = 'a'

test :: Char
test = foo @ Int @ Char 23

您确定ab之间没有任何功能依赖关系吗?否则,您必须始终使用显式类型参数消除歧义。

票数 2
EN

Stack Overflow用户

发布于 2016-09-30 18:43:18

为了说明这个问题,请考虑以下两个例子:

代码语言:javascript
复制
instance Char Double where
  a = 'x'
  b = 42.0

instance Char Int where
  a = 'x'
  b = 17

现在f 'c'需要等于b,但是哪个b呢?有两个C实例可以工作。

一种解决方案是使用函数依赖项来强制b类型依赖于a类型。

代码语言:javascript
复制
class C a b | b -> a where
   a :: a
   b :: b

请注意,您可能会遇到一些需要显式注释的类型推断问题。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39796621

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档