是否有默认的多态单元类型haskell

是否有默认的多态单元类型haskell,haskell,Haskell,在Haskell中有一个默认的单位类型,即()。我正在寻找一个多态的(最好是在Hackage中),例如: data PUT a = PUT 或者可能是多态零类型: data PZT a = PZT (PZT a) 所以,是的,我可以自己写一篇,通过上面的陈述。我想在hackage找一个 我之所以需要它,是因为我有一个具有多个类型参数的类,其中包含一个不使用其中一个参数的函数: class MyClass a b where someFunction :: a -- and some

在Haskell中有一个默认的单位类型,即()。我正在寻找一个多态的(最好是在Hackage中),例如:

data PUT a = PUT
或者可能是多态零类型:

data PZT a = PZT (PZT a)
所以,是的,我可以自己写一篇,通过上面的陈述。我想在hackage找一个

我之所以需要它,是因为我有一个具有多个类型参数的类,其中包含一个不使用其中一个参数的函数:

class MyClass a b where
  someFunction :: a
  -- and some other functions
使用此函数“someFunction”时,GHC找不到正确的实例,因此我更改了定义:

class MyClass a b where
  someFunction :: (PUT b) -> a
现在,当我调用someFunction时,我可以使用(PUT::SomeType)作为它的第一个参数,Haskell可以派生出我所指的实例。每次我使用这个技巧时,我都会编写一个新的多态单元类型(它只是一行代码),这在组合不同的库时会给我带来一些额外的工作(因为我最好在任何地方都使用相同的构造函数)。
我确信其他人也遇到了这个问题,所以也许其中一个人在hackage(ghc的数据包管理器)中提出了解决方案?我想进口它。我是在寻找错误的东西,还是它在hackage中不存在?

我想你寻找的通常是
代理。从base-4.7开始,它在


一个类似的东西,在base中可用,因为它比
Proxy
长,例如,您可以使用
Const()

我对“多态零类型”的含义感到困惑。我本以为它的意思是,一种除了未定义之外无人居住的类型,比如Void。但是我可以通过
让p=PZT p
来构造PZT类型的值,并且可以成功地在其上进行模式匹配,所以我要么误解了PZT的意思,要么你的PZT不是PZT。当然,您可以更简单地构建多态Void:
数据避免一个
无人居住。您确定不需要funDep吗?有助于MPTC的推理。事实证明,您并不真正需要这样的类型。下面的方法同样有效:
类MyClass a b其中有一些函数::(f b)->a
注意,由于没有关于f的信息(它不适用或任何东西),这意味着无法到达b,这正是我所需要的。@Sebastiaan是的,这是一个很好的做法。函数的用法通常以多态方式处理它(
proxy a->b
而不是
proxy a->b
),因此,如果有一个函数,您可以替换您选择的函子,而不是被迫编写
proxy::proxy MyType
并启用
ScopedTypeVariables
。这就是API的工作原理。还要注意一个常见的习惯用法,即将
someFunction
的类型表示为
Proxy b->a
,而不是
Proxy b->a
(注意大写),这样就不需要
Proxy
本身。