[英]Haskell Wreq - Couldn't match expected type ‘GHC.Exts.Item a0’
[英]How to unify c and GHC.Exts.Item t c?
我刚刚更新了动态时间扭曲库以使用ghc-7.10
进行编译,却遇到了一个奇怪的问题:
在ghc-7.8
中编译良好的代码:
{-# LANGUAGE OverloadedLists #-}
{-# LANGUAGE TypeFamilies #-}
dtwNaive :: (Ord c, Fractional c, DataSet a, DataSet b)
=> (Item a -> Item b -> c) -> a -> b -> c
dtwNaive δ as bs = go (len as - 1) (len bs - 1)
where go 0 0 = 0
go _ 0 = 1/0
go 0 _ = 1/0
go x y = δ (ix as x) (ix bs y) + minimum [ go (x-1) y
, go x (y-1)
, go (x-1) (y-1)
]
现在产生以下错误:
src/Data/DTW.hs:112:52:
Couldn't match type ‘c’ with ‘GHC.Exts.Item (t1 c)’
‘c’ is a rigid type variable bound by
the type signature for
dtwNaive :: (Ord c, Fractional c, DataSet a, DataSet b) =>
(Item a -> Item b -> c) -> a -> b -> c
at src/Data/DTW.hs:106:13
Expected type: Int -> [c] -> t1 c
Actual type: Int -> [GHC.Exts.Item (t1 c)] -> t1 c
Relevant bindings include
go :: Int -> Int -> c (bound at src/Data/DTW.hs:109:11)
δ :: Item a -> Item b -> c (bound at src/Data/DTW.hs:108:10)
dtwNaive :: (Item a -> Item b -> c) -> a -> b -> c
(bound at src/Data/DTW.hs:108:1)
In the first argument of ‘minimum’, namely
‘[go (x - 1) y, go x (y - 1), go (x - 1) (y - 1)]’
In the second argument of ‘(+)’, namely
‘minimum [go (x - 1) y, go x (y - 1), go (x - 1) (y - 1)]’
In the expression:
δ (ix as x) (ix bs y)
+ minimum [go (x - 1) y, go x (y - 1), go (x - 1) (y - 1)]
我诚实地困惑,我相信, [c]
是同样的事情[GHC.Exts.Item (tc)]
时, t ~ []
我想念什么?
minimum
的类型与以前不同。 旧类型为Ord a => [a] -> a
。 新类型是(Ord a, Foldable t) => ta -> a
。
列表文字的IsList
实例是minimum
的参数,这不再是显而易见的。 您可以通过添加本地注释来解决此问题:
{-# LANGUAGE ScopedTypeVariables #-}
dtwNaive ::
forall a b c.
(Ord c, Fractional c, DataSet a, DataSet b)
=> (Item a -> Item b -> c) -> a -> b -> c
dtwNaive = ...
minimum ([go (x-1) y, go x (y-1), go (x-1) (y-1)] :: [c])
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.