Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Haskell:此数据类型的函子?_Haskell_Functor - Fatal编程技术网

Haskell:此数据类型的函子?

Haskell:此数据类型的函子?,haskell,functor,Haskell,Functor,对不起,标题不好。我有一个有问题的数据类型,我试图将其定义为functor的实例 所以基本上,我拥有的是一些 sample_logp :: s a -> a 它应该使用 (a -> b) 到 。下面的代码并不能完全实现这一点,只在 sample_logp :: s a -> b 我所尝试的可能吗?如果是这样,如何更新此代码以实现此目的?这里的标准方法是添加更多类型变量 data Model s a b = Model { sample_logp :: s a -

对不起,标题不好。我有一个有问题的数据类型,我试图将其定义为functor的实例

所以基本上,我拥有的是一些

sample_logp :: s a -> a
它应该使用

(a -> b)

。下面的代码并不能完全实现这一点,只在

sample_logp :: s a -> b  


我所尝试的可能吗?如果是这样,如何更新此代码以实现此目的?

这里的标准方法是添加更多类型变量

data Model s a b = Model {
  sample_logp :: s a -> b
}
拆分类型变量后,您可以访问更多工具。这门课在这里很合适。(由于我在此系统上没有ghc,所以未进行类型检查-如果我的实现已关闭,请进行注释或修复。)

现在,假设您有一个
型号SA
,它相当于您的
型号SA
,您可以使用
dimap bToA aToB
将其转换为
型号SB

正如注释所说,原始数据类型是不变的,因为它在正负位置使用相同的类型变量。这意味着您需要在每个方向上提供转换函数。添加一个额外的类型变量可以让您利用现有的工具来实现这一点,如
Profunctor



请注意,以上所有内容都基于这样的假设,即您正在为
s
使用协变类型。如果
s
是逆变的,那么您可以为原始类型编写一个直接的
Functor
实例,正如chi的评论所说。这是一种不太常见的情况。

它不可能是函子:
a
同时处于协变和逆变位置。谢谢!在这种情况下,是否有其他类型类可以实现这一点?您可以检查,但设计选择在很大程度上取决于
s
是什么。@tero如果您可以将
s
限制为a,则可以为
模型s
定义一个函子实例。很难说这对你的案例是否有用。你可以为它写一个实例,但这可能不会给你带来太多好处。
data Model s a = Model {
  sample_logp :: s a -> a
}

instance Functor (Model s) where
  fmap f m = Model {
    sample_logp = sample_logp'
  } where sample_logp' x = (f . (sample_logp m)) x
data Model s a b = Model {
  sample_logp :: s a -> b
}
instance (Functor s) => Profunctor (Model s) where
    dimap f g (Model h) = Model $ g . h . fmap f
    lmap f (Model h) = Model $ h . fmap f
    rmap g (Model h) = Model $ g . h