'lub' and 'both' on strictness - what does it mean for products to have different arity?
Simon Peyton Jones
simonpj at microsoft.com
Tue Mar 1 17:01:27 UTC 2016
Omer
Joachim is right. The strictness analyser just looks inside casts, so these unexpectedly ill-typed cases could show up. For example
f :: T a -> a -> Int
f x y = case x of
P1 -> case y of (a,b,c) -> a+b+c
P2 -> case y of (p,q) -> p+q
data T a where
P1 :: T (Int,Int,Int)
P2 :: T (Int,Int)
In the P1 branch we have that y::(Int,Int,Int), so we'll get a demand S(SSS). And similarly in the P2 branch. Now we combine them. And there you have it.
Could I ask that you add this example as a Note to the relevant functions, so that the next time someone asks this question they'll find the answer right there?
Thanks
Simon
| -----Original Message-----
| From: ghc-devs [mailto:ghc-devs-bounces at haskell.org] On Behalf Of Ömer
| Sinan Agacan
| Sent: 19 February 2016 17:27
| To: ghc-devs <ghc-devs at haskell.org>
| Subject: 'lub' and 'both' on strictness - what does it mean for
| products to have different arity?
|
| I was looking at implementations of LUB and AND on demand signatures
| and I found this interesting case:
|
| lubStr (SProd s1) (SProd s2)
| | length s1 == length s2 = mkSProd (zipWith lubArgStr s1 s2)
| | otherwise = HeadStr
|
| The "otherwise" case is interesting, I'd expect that to be an error.
| I'm trying to come up with an example, let's say I have a case
| expression:
|
| case x of
| P1 -> RHS1
| P2 -> RHS2
|
| and y is used in RHS1 with S(SS) and in RHS2 with S(SSS). This seems to
| me like a type error leaked into the demand analysis.
|
| Same thing applies to `bothDmd` too. Funnily, it has this extra comment
| on this same code:
|
| bothStr (SProd s1) (SProd s2)
| | length s1 == length s2 = mkSProd (zipWith bothArgStr s1 s2)
| | otherwise = HyperStr -- Weird
|
| Does "Weird" here means "type error and/or bug" ?
|
| Should I try replacing these cases with panics and try to validate?
| _______________________________________________
| ghc-devs mailing list
| ghc-devs at haskell.org
| https://na01.safelinks.protection.outlook.com/?url=http%3a%2f%2fmail.ha
| skell.org%2fcgi-bin%2fmailman%2flistinfo%2fghc-
| devs&data=01%7c01%7csimonpj%40064d.mgd.microsoft.com%7cdd8ae326a8e14ef8
| 9e8608d339520cb9%7c72f988bf86f141af91ab2d7cd011db47%7c1&sdata=sRFRKgj3y
| zQdEZT4y7KLk18cP43Rv1J%2bx8oPZyr1QzA%3d
More information about the ghc-devs
mailing list