'lub' and 'both' on strictness - what does it mean for products to have different arity?
Ömer Sinan Ağacan
omeragacan at gmail.com
Wed Mar 2 06:07:04 UTC 2016
> 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
Yep, I'll do that soon.
2016-03-01 12:01 GMT-05:00 Simon Peyton Jones <simonpj at microsoft.com>:
> 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?
> | -----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