haskell 如何修复此单态限制警告

9rygscc1  于 2023-06-23  发布在  其他
关注(0)|答案(1)|浏览(155)

当我在ghci中加载以下代码时,我得到一个单态限制警告,建议的修复方法是

Consider giving ‘pexp’ and ‘nDividedByPExp’ a type signature
   |
17 |            (nDividedByPExp, pexp) = getPExp' nDividedByP 1

但这么做并不能解决问题然后我得到了错误:

Overloaded signature conflicts with monomorphism restriction
        nDividedByPExp :: Integral i => i

下面是代码:

{-# OPTIONS_GHC -Wall -fno-warn-incomplete-patterns #-}
{-# LANGUAGE ExplicitForAll, ScopedTypeVariables #-}

pfactor :: forall i. Integral i =>  i -> [(i, i)]
-- pfactor :: Integral i => i -> [(i, i)]
pfactor m =
   pf' m [] $ primesUpTo (floorSqrt m)
   where
     pf' :: Integral i => i -> [(i, i)] ->[i] -> [(i, i)]
     pf' n res (p : ps)
         | pIsNotAFactor = pf' n res ps     
         | otherwise = pf' nDividedByPExp ((p, pexp) : res) remainingPrimes
         where
           (nDividedByP, r)       = n `quotRem` p
           pIsNotAFactor          = r /= 0
           -- nDividedByPExp, pexp :: Integral i => i
           (nDividedByPExp, pexp) = getPExp' nDividedByP 1
           -- getPExp' :: Integral i => i -> i -> (i, i)
           getPExp' currNDividedByP currExp
               | pDoesNotDivideCurrNDividedByP   = (currNDividedByP, currExp)
               | otherwise                       = getPExp' q1 (currExp + 1)
               where
                 -- q1, r1 :: Integral i => i
                 (q1, r1)                      = currNDividedByP `quotRem` p
                 pDoesNotDivideCurrNDividedByP = r1 /= 0
           remainingPrimes = takeWhile (<= floorSqrt nDividedByPExp) ps

floorSqrt :: Integral i => i -> i
floorSqrt = undefined

primesUpTo :: Integral i => i -> [i]
primesUpTo = undefined

我尝试按照建议在注解行16中添加声明,但导致了如上所述的错误。
我从实际代码中删除了一些行,使其更简单。我不期望上面的代码能够正常运行,但我确实期望它能够在没有警告的情况下编译。我不知道如何解决我收到的警告。

h9vpoimq

h9vpoimq1#

当你将它们的类型声明为nDividedByPExp, pexp :: Integral i => i时,它将被视为nDividedByPExp, pexp :: forall i. Integral i => i。这个i和在顶层声明的i将是不同的类型,即使您使用ScopedTypeVariables将后者引入作用域。此外,i仍然是多态的。
您可以将其声明为nDividedByPExp, pexp :: i,其中i指的是顶层的i,它绑定到特定类型,因此是单态的。

相关问题