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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/laravel/12.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 难以理解GHC关于歧义的投诉_Haskell_Ghc - Fatal编程技术网

Haskell 难以理解GHC关于歧义的投诉

Haskell 难以理解GHC关于歧义的投诉,haskell,ghc,Haskell,Ghc,我正在尝试创建一个简单的Haskell进化算法,并试图使其尽可能通用。这最初是我用Python解决的一项任务,当时我想回到有更多时间用Haskell解决的时候。任务要求代码非常灵活,我在Haskell的初步实现中尝试重新创建代码 在下面的代码中,您可以看到GHC给我的错误: Ambiguous type variable 'a0' in the constraint: (Genome a0) arising from a use of 'crossover' Probable fix: ad

我正在尝试创建一个简单的Haskell进化算法,并试图使其尽可能通用。这最初是我用Python解决的一项任务,当时我想回到有更多时间用Haskell解决的时候。任务要求代码非常灵活,我在Haskell的初步实现中尝试重新创建代码

在下面的代码中,您可以看到GHC给我的错误:

Ambiguous type variable 'a0' in the constraint:
  (Genome a0) arising from a use of 'crossover'
Probable fix: add a type signature that fixes these type variable(s)
In the expression: crossover cross (genome dad) (genome mom)
In the first argument of 'mapM', namely
  '(\ (dad, mom) -> crossover cross (genome dad) (genome mom))'
In a stmt of a 'do' block:
  children <- mapM
                (\ (dad, mom) -> crossover cross (genome dad) (genome mom)) parents
给我带来问题的代码是:

breed :: (Phenotype b) => [(b, b)] -> Double -> Double -> IO [b]
breed parents cross mute = do
      children <- mapM (\ (dad, mom) -> crossover cross (genome dad) (genome mom)) parents
      let ch1 = map fst children ++ map snd children
      mutated <- mapM (mutate mute) ch1
      return $ map develop mutated
品种::(表型b)=>[(b,b)]->双->双->双->IO[b]
杂交双亲
儿童交叉(基因组dad)(基因组mom))父母
让ch1=映射fst子级++映射snd子级

突变的儿童:基因组a=>[(a,a)]
<代码>ch1::基因组a=>[a]。等等。“什么样的数据类型是
a
?”-哈斯克尔问道。“我需要检查它是否属于
基因组
类型类”

代码中的任何内容都不能确定
a
的具体数据类型,只能使用方法进行操作

您还需要将
a
放入返回类型,并将
基因组a
添加到约束中,以便由
品种
的调用站点确定:


品种::(表型b,基因组a)=>[(b,b)]->双->双->(a,IO[b])
儿童::基因组a=>[(a,a)]
<代码>ch1::基因组a=>[a]。等等。“什么样的数据类型是
a
?”-哈斯克尔问道。“我需要检查它是否属于
基因组
类型类”

代码中的任何内容都不能确定
a
的具体数据类型,只能使用方法进行操作

您还需要将
a
放入返回类型,并将
基因组a
添加到约束中,以便由
品种
的调用站点确定:


bride::(表型b,基因组a)=>[(b,b)]->Double->Double->(某种东西a,IO[b])

问题源于调用bride函数的源代码。什么类型的
b
,从哪里调用繁殖功能?@mhiza如果我理解正确,源代码中的
b
类型也应该是类表型。完整的代码在这里,问题源于调用繁殖函数的源代码。什么类型的
b
,从哪里调用繁殖功能?@mhiza如果我理解正确,源代码中的
b
类型也应该是类表型。完整的代码在这里,嗯,我想我理解这个问题,但我仍然不明白为什么它是一个问题。
ch1::Genome a=>[a]
这一事实不足以确定
ch1
的所有成员必须支持
突变
发展
,从而确保我从该方法中获得
表型
。我的想法是,无论是品种还是调用者都不需要知道中间步骤到
基因组
,只要它知道它得到了一个正确的
表型
,这可能是完全正确的wrong@Nordmoench1的每个成员都属于必须属于基因组类型的
a
。具体的数据类型是什么?不知道。我们知道它必须支持行动,但行动是什么?我们必须执行它。你所描述的是两种类型的功能多态性,一种是基因组,另一种是表型。确切的表型是由
品种
的呼叫部位根据您的类型特征决定的。对基因组来说并非如此。如果希望特定基因组保持隐藏状态,则必须在
品种中提供特定基因组类型。或者,让
品种
在基因组中也具有多态性。啊,我明白了,我对类和方法之间的相互作用的理解非常不正确。但是,我想知道除了返回一些
基因组
,是否还有其他方法?它们只会被扔掉,因为上面的每个品种都对
表型感兴趣produces@Nordmoen为此,您必须重新设计您的类型。你可以问另一个问题,关于如何重新设计你的类型,使你不必这样做。嗯,我想我理解这个问题,但我仍然不明白为什么它是一个问题。
ch1::Genome a=>[a]
这一事实不足以确定
ch1
的所有成员必须支持
突变
发展
,从而确保我从该方法中获得
表型
。我的想法是,无论是品种还是调用者都不需要知道中间步骤到
基因组
,只要它知道它得到了一个正确的
表型
,这可能是完全正确的wrong@Nordmoench1的每个成员都属于必须属于基因组类型的
a
。具体的数据类型是什么?不知道。我们知道它必须支持行动,但行动是什么?我们必须执行它。你所描述的是两种类型的功能多态性,一种是基因组,另一种是表型。确切的表型是由
品种
的呼叫部位根据您的类型特征决定的。对基因组来说并非如此。如果希望特定基因组保持隐藏状态,则必须在
品种中提供特定基因组类型。或者,让
品种
在基因组中也具有多态性。啊,我明白了,我对类和方法之间的相互作用的理解非常不正确。但是,我想知道除了返回一些
基因组
,是否还有其他方法?它们只会被扔掉,因为上面的每个品种都对
表型感兴趣produces@Nordmoen为此,您必须重新设计您的类型。你可以问另一个问题,关于如何重新设计你的类型,这样你就不必这么做。
breed :: (Phenotype b) => [(b, b)] -> Double -> Double -> IO [b]
breed parents cross mute = do
      children <- mapM (\ (dad, mom) -> crossover cross (genome dad) (genome mom)) parents
      let ch1 = map fst children ++ map snd children
      mutated <- mapM (mutate mute) ch1
      return $ map develop mutated