繁体   English   中英

如何统一c和GHC.Exts.Item tc?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM