GHC issueshttps://gitlab.haskell.org/ghc/ghc/-/issues2019-07-07T18:39:34Zhttps://gitlab.haskell.org/ghc/ghc/-/issues/9668Unicode info is out of date2019-07-07T18:39:34ZDavid FeuerUnicode info is out of dateThe automatically generated `WCsubst.c` was last generated in 2011. The Unicode standard has been updated several times since then. I would like to try to replace that whole mechanism with something a little more cache-friendly, but at t...The automatically generated `WCsubst.c` was last generated in 2011. The Unicode standard has been updated several times since then. I would like to try to replace that whole mechanism with something a little more cache-friendly, but at the very least the tables need to be right. Unfortunately, the script that generates this file gives no information about its input format, or just where a file with the right format is supposed to come from.7.10.1Edward KmettEdward Kmetthttps://gitlab.haskell.org/ghc/ghc/-/issues/9664Add identity functor to base2019-07-07T18:39:36ZHerbert Valerio Riedelhvr@gnu.orgAdd identity functor to base`base` already provides a `Const`ant functor, but the even more useful `Id`entity (or `Identity`) functor does not exist in `base` yet.
This was already [proposed to the CLC back in early 2013](https://groups.google.com/forum/#!msg/hask...`base` already provides a `Const`ant functor, but the even more useful `Id`entity (or `Identity`) functor does not exist in `base` yet.
This was already [proposed to the CLC back in early 2013](https://groups.google.com/forum/#!msg/haskell-core-libraries/_nReDCbROew/Mdmf0zIloysJ), and already missed inclusion in GHC 7.8
However, in order to implement this, coordination with `transformers` is desirable, as `transformers` currently provides a non-transforming `Data.Functor.Identity`, and we'd like to avoid name clashes.
<details><summary>Trac metadata</summary>
| Trac field | Value |
| ---------------------- | --------------------- |
| Version | |
| Type | Task |
| TypeOfFailure | OtherFailure |
| Priority | normal |
| Resolution | Unresolved |
| Component | Core Libraries |
| Test case | |
| Differential revisions | |
| BlockedBy | |
| Related | |
| Blocking | |
| CC | ekmett, ross, simonpj |
| Operating system | |
| Architecture | |
</details>
<!-- {"blocked_by":[],"summary":"Add identity functor to base","status":"New","operating_system":"","component":"Core Libraries","related":[],"milestone":"7.10.1","resolution":"Unresolved","owner":{"tag":"OwnedBy","contents":"ekmett"},"version":"","keywords":[],"differentials":[],"test_case":"","architecture":"","cc":["ekmett","ross","simonpj"],"type":"Task","description":"`base` already provides a `Const`ant functor, but the even more useful `Id`entity (or `Identity`) functor does not exist in `base` yet.\r\n\r\nThis was already [https://groups.google.com/forum/#!msg/haskell-core-libraries/_nReDCbROew/Mdmf0zIloysJ proposed to the CLC back in early 2013], and already missed inclusion in GHC 7.8\r\n\r\nHowever, in order to implement this, coordination with `transformers` is desirable, as `transformers` currently provides a non-transforming `Data.Functor.Identity`, and we'd like to avoid name clashes.","type_of_failure":"OtherFailure","blocking":[]} -->7.10.1Edward KmettEdward Kmetthttps://gitlab.haskell.org/ghc/ghc/-/issues/9662stack overflow in type checker2019-07-07T18:39:36ZLemmingstack overflow in type checkerThe attached program causes a stack overflow when loading into ghci-7.8.3 or ghci-7.9.20140929:
```
$ ghci-7.8.3 -Wall BackpermuteTypeLoop.hs
GHCi, version 7.8.3: http://www.haskell.org/ghc/ :? for help
Loading package ghc-prim ... lin...The attached program causes a stack overflow when loading into ghci-7.8.3 or ghci-7.9.20140929:
```
$ ghci-7.8.3 -Wall BackpermuteTypeLoop.hs
GHCi, version 7.8.3: http://www.haskell.org/ghc/ :? for help
Loading package ghc-prim ... linking ... done.
Loading package integer-gmp ... linking ... done.
Loading package base ... linking ... done.
[1 of 1] Compiling BackpermuteTypeLoop ( BackpermuteTypeLoop.hs, interpreted )
*** Exception: stack overflow
```
I have no idea, what's going on. The problem may be even not critical, because the program is not type-correct anyway. If you replace the `id` argument by the out-commented `modify` argument, you will get a nice type error message.
The problem arised when using the Accelerate framework and it involves the `modify` function which helps tupling function arguments and untupling function results.
<details><summary>Trac metadata</summary>
| Trac field | Value |
| ---------------------- | ------------ |
| Version | 7.8.3 |
| Type | Bug |
| TypeOfFailure | OtherFailure |
| Priority | normal |
| Resolution | Unresolved |
| Component | Compiler |
| Test case | |
| Differential revisions | |
| BlockedBy | |
| Related | |
| Blocking | |
| CC | |
| Operating system | |
| Architecture | |
</details>
<!-- {"blocked_by":[],"summary":"stack overflow in type checker","status":"New","operating_system":"","component":"Compiler","related":[],"milestone":"","resolution":"Unresolved","owner":{"tag":"Unowned"},"version":"7.8.3","keywords":[],"differentials":[],"test_case":"","architecture":"","cc":[""],"type":"Bug","description":"The attached program causes a stack overflow when loading into ghci-7.8.3 or ghci-7.9.20140929:\r\n\r\n{{{\r\n$ ghci-7.8.3 -Wall BackpermuteTypeLoop.hs\r\nGHCi, version 7.8.3: http://www.haskell.org/ghc/ :? for help\r\nLoading package ghc-prim ... linking ... done.\r\nLoading package integer-gmp ... linking ... done.\r\nLoading package base ... linking ... done.\r\n[1 of 1] Compiling BackpermuteTypeLoop ( BackpermuteTypeLoop.hs, interpreted )\r\n*** Exception: stack overflow\r\n}}}\r\n\r\nI have no idea, what's going on. The problem may be even not critical, because the program is not type-correct anyway. If you replace the `id` argument by the out-commented `modify` argument, you will get a nice type error message.\r\n\r\nThe problem arised when using the Accelerate framework and it involves the `modify` function which helps tupling function arguments and untupling function results.","type_of_failure":"OtherFailure","blocking":[]} -->7.10.1https://gitlab.haskell.org/ghc/ghc/-/issues/9654Clean up stringify in util/hsc2hs/CrossCodegen2019-07-07T18:39:38ZDavid FeuerClean up stringify in util/hsc2hs/CrossCodegenCurrently, it's defined
```hs
stringify :: String -> String
stringify s = reverse . dropWhile isSpace . reverse -- drop trailing space
. dropWhile isSpace -- drop leading space
. compressS...Currently, it's defined
```hs
stringify :: String -> String
stringify s = reverse . dropWhile isSpace . reverse -- drop trailing space
. dropWhile isSpace -- drop leading space
. compressSpaces -- replace each span of
-- whitespace with a single space
$ s
where compressSpaces [] = []
compressSpaces (a:as) | isSpace a = ' ' : compressSpaces (dropWhile isSpace as)
compressSpaces (a:as) = a : compressSpaces as
```
If we're going to go to the trouble of doing this by hand, we might as well take the efficiency advantage doing so can give us:
```hs
stringify :: String -> String
-- Spec: stringify = unwords . words
stringify xs = go False (dropWhile isSpace xs)
where
go _haveSpace [] = []
go haveSpace (x:xs)
| isSpace x = go True xs
| otherwise = if haveSpace
then ' ' : x : go False xs
else x : go False xs
```
<details><summary>Trac metadata</summary>
| Trac field | Value |
| ---------------------- | ------------- |
| Version | 7.9 |
| Type | Task |
| TypeOfFailure | OtherFailure |
| Priority | normal |
| Resolution | Unresolved |
| Component | Code Coverage |
| Test case | |
| Differential revisions | |
| BlockedBy | |
| Related | |
| Blocking | |
| CC | |
| Operating system | |
| Architecture | |
</details>
<!-- {"blocked_by":[],"summary":"Clean up stringify in util/hsc2hs/CrossCodegen","status":"New","operating_system":"","component":"Code Coverage","related":[],"milestone":"7.10.1","resolution":"Unresolved","owner":{"tag":"Unowned"},"version":"7.9","keywords":[],"differentials":[],"test_case":"","architecture":"","cc":[""],"type":"Task","description":"Currently, it's defined\r\n\r\n{{{#!hs\r\nstringify :: String -> String\r\nstringify s = reverse . dropWhile isSpace . reverse -- drop trailing space\r\n . dropWhile isSpace -- drop leading space\r\n . compressSpaces -- replace each span of\r\n -- whitespace with a single space\r\n $ s\r\n where compressSpaces [] = []\r\n compressSpaces (a:as) | isSpace a = ' ' : compressSpaces (dropWhile isSpace as)\r\n compressSpaces (a:as) = a : compressSpaces as\r\n}}}\r\n\r\nIf we're going to go to the trouble of doing this by hand, we might as well take the efficiency advantage doing so can give us:\r\n\r\n{{{#!hs\r\nstringify :: String -> String\r\n-- Spec: stringify = unwords . words\r\nstringify xs = go False (dropWhile isSpace xs)\r\n where\r\n go _haveSpace [] = []\r\n go haveSpace (x:xs)\r\n | isSpace x = go True xs\r\n | otherwise = if haveSpace\r\n then ' ' : x : go False xs\r\n else x : go False xs\r\n}}}","type_of_failure":"OtherFailure","blocking":[]} -->7.10.1https://gitlab.haskell.org/ghc/ghc/-/issues/9644mapMaybes documentation contains some gibberish2019-07-07T18:39:40ZmineomapMaybes documentation contains some gibberish"If it just Just b, \[...\]"
<details><summary>Trac metadata</summary>
| Trac field | Value |
| ---------------------- | -------------- |
| Version | 7.8.3 |
| Type | Bug ..."If it just Just b, \[...\]"
<details><summary>Trac metadata</summary>
| Trac field | Value |
| ---------------------- | -------------- |
| Version | 7.8.3 |
| Type | Bug |
| TypeOfFailure | OtherFailure |
| Priority | normal |
| Resolution | Unresolved |
| Component | libraries/base |
| Test case | |
| Differential revisions | |
| BlockedBy | |
| Related | |
| Blocking | |
| CC | ekmett, hvr |
| Operating system | |
| Architecture | |
</details>
<!-- {"blocked_by":[],"summary":"mapMaybes documentation contains some gibberish","status":"New","operating_system":"","component":"libraries/base","related":[],"milestone":"","resolution":"Unresolved","owner":{"tag":"Unowned"},"version":"7.8.3","keywords":[],"differentials":[],"test_case":"","architecture":"","cc":["ekmett","hvr"],"type":"Bug","description":"\"If it just Just b, [...]\"","type_of_failure":"OtherFailure","blocking":[]} -->7.10.1https://gitlab.haskell.org/ghc/ghc/-/issues/9639Remove OldTypeable2019-07-07T18:39:41ZdreixelRemove OldTypeableI think it's safe to remove `Data.OldTypeable` now. It's been deprecated in 7.8, and we said that we'd remove it for 7.10. This ticket is to record that task, and to check that there are no objections to removing it.
<details><summary>T...I think it's safe to remove `Data.OldTypeable` now. It's been deprecated in 7.8, and we said that we'd remove it for 7.10. This ticket is to record that task, and to check that there are no objections to removing it.
<details><summary>Trac metadata</summary>
| Trac field | Value |
| ---------------------- | ------------ |
| Version | 7.9 |
| Type | Task |
| TypeOfFailure | OtherFailure |
| Priority | normal |
| Resolution | Unresolved |
| Component | Compiler |
| Test case | |
| Differential revisions | |
| BlockedBy | |
| Related | |
| Blocking | |
| CC | |
| Operating system | |
| Architecture | |
</details>
<!-- {"blocked_by":[],"summary":"Remove OldTypeable","status":"New","operating_system":"","component":"Compiler","related":[],"milestone":"","resolution":"Unresolved","owner":{"tag":"Unowned"},"version":"7.9","keywords":[],"differentials":[],"test_case":"","architecture":"","cc":[""],"type":"Task","description":"I think it's safe to remove `Data.OldTypeable` now. It's been deprecated in 7.8, and we said that we'd remove it for 7.10. This ticket is to record that task, and to check that there are no objections to removing it.","type_of_failure":"OtherFailure","blocking":[]} -->7.10.1https://gitlab.haskell.org/ghc/ghc/-/issues/9633PolyKinds in 7.8.2 vs 7.8.32019-07-07T18:39:44ZEric CrockettPolyKinds in 7.8.2 vs 7.8.3The following code **compiles** with GHC 7.8.2.
This code has been distilled down from a larger example where I needed `-XPolyKinds` in Bar.hs but not in Foo.hs. In addition, the `modify` function is supposed to modify a mutable `Data.V...The following code **compiles** with GHC 7.8.2.
This code has been distilled down from a larger example where I needed `-XPolyKinds` in Bar.hs but not in Foo.hs. In addition, the `modify` function is supposed to modify a mutable `Data.Vector`, hence the inner `go` function has the intended type of `Int -> m ()`, though strictly speaking it could return any value since everything is discarded by the `forM_`.
```
-- {-# LANGUAGE PolyKinds #-}
module Foo where
import Control.Monad (forM_)
import Bar
-- Vector signatures
unsafeRead :: (Monad m) => v (PrimState m) a -> Int -> m a
unsafeRead = error "type only"
unsafeWrite :: (Monad m) => v (PrimState m) a -> Int -> a -> m ()
unsafeWrite = error "type only"
modify :: Int -> Bar v r
modify p = Bar (p-1) $ \y -> do
let go i = do
a <- unsafeRead y i
unsafeWrite y i a
--return a
forM_ [0..(p-1)] go
```
```
{-# LANGUAGE RankNTypes, KindSignatures, TypeFamilies, PolyKinds #-}
module Bar where
type family PrimState (m :: * -> *) :: *
data Bar v r = Bar Int (forall s . (Monad s) => v (PrimState s) r -> s ())
```
In 7.8.3, this above code results in the error (with `-fprint-explicit-kinds`)
```
Foo.hs:19:23:
Couldn't match type ‘a0’ with ‘r’
‘a0’ is untouchable
inside the constraints (Monad m,
(~) * (PrimState m) (PrimState s))
bound by the inferred type of
go :: (Monad m, (~) * (PrimState m) (PrimState s)) =>
Int -> m ()
at Foo.hs:(18,7)-(20,23)
‘r’ is a rigid type variable bound by
the type signature for modify :: Int -> Bar * v r at Foo.hs:16:11
Expected type: v0 (PrimState m) a0
Actual type: v (PrimState s) r
...
In the first argument of ‘unsafeRead’, namely ‘y’
In a stmt of a 'do' block: a <- unsafeRead y i
Foo.hs:20:19:
Couldn't match type ‘v1’ with ‘v’
‘v1’ is untouchable
inside the constraints (Monad m,
(~) * (PrimState m) (PrimState s))
bound by the inferred type of
go :: (Monad m, (~) * (PrimState m) (PrimState s)) =>
Int -> m ()
at Foo.hs:(18,7)-(20,23)
‘v’ is a rigid type variable bound by
the type signature for modify :: Int -> Bar * v r at Foo.hs:16:11
Expected type: v1 (PrimState m) a0
Actual type: v (PrimState s) r
...
In the first argument of ‘unsafeWrite’, namely ‘y’
...
Failed, modules loaded: Bar.
```
After much digging, I found that enabling `-XPolyKinds` in Foo.hs gives a more meaningful error:
```
Foo.hs:19:23:
Could not deduce ((~) (* -> k -> *) v v0)
...
Expected type: v0 (PrimState m) a0
Actual type: v (PrimState s) r
...
In the first argument of ‘unsafeRead’, namely ‘y’
In a stmt of a 'do' block: a <- unsafeRead y i
Foo.hs:20:19:
Could not deduce ((~) (* -> k -> *) v v1)
...
Expected type: v1 (PrimState m) a0
Actual type: v (PrimState s) r
...
In the first argument of ‘unsafeWrite’, namely ‘y’
In a stmt of a 'do' block: unsafeWrite y i a
Failed, modules loaded: Bar.
```
Adding `PolyKinds` to Foo.hs *and* uncommenting `return a` results in the error:
```
Foo.hs:17:12:
Couldn't match kind ‘k’ with ‘k1’
because type variable ‘k1’ would escape its scope
This (rigid, skolem) type variable is bound by
the type signature for modify :: Int -> Bar k1 v r
at Foo.hs:16:11-24
Expected type: Bar k1 v r
Actual type: Bar k v0 r0
...
In the expression:
Bar (p - 1)
$ \ y
-> do { let ...;
forM_ [0 .. (p - 1)] go }
...
Foo.hs:18:7:
Kind incompatibility when matching types:
v0 :: * -> k -> *
v1 :: * -> * -> *
...
When checking that ‘go’
has the inferred type ‘forall (k :: BOX)
(m :: * -> *)
b
(v :: * -> * -> *)
(v1 :: * -> * -> *).
((~) (* -> k -> *) v0 v, (~) k r0 b, (~) (* -> k -> *) v0 v1,
Monad m, (~) * (PrimState m) (PrimState s)) =>
Int -> m b’
Probable cause: the inferred type is ambiguous
In the expression:
do { let go i = ...;
forM_ [0 .. (p - 1)] go }
...
Failed, modules loaded: Bar.
```
These errors can be resolved by modifying the original code above in any of the following ways:
1. Remove `-XPolyKinds` from Bar.hs
1. Add an explicit kind signature to the `v :: * -> * -> *` parameter of type `Bar`
1. With `PolyKinds` in Bar but \*not\* Foo, uncommenting `return a` make GHC 7.8.3. compile
What I'm trying to understand is
1. Why there is different behavior from 7.8.2 to 7.8.3. There doesn't seem to be anything addressing `PolyKinds` in the [release notes vs 7.8.2](http://www.haskell.org/ghc/docs/7.8.3/html/users_guide/release-7-8-3.html) .
1. In the event the above code should not compile with 7.8.3, there error message could be much clearer. The first error message above didn't help me understand that `PolyKinds` was to blame, while the second error did a better job, and the third was very clearly a `PolyKinds` issue (i.e. `kind mismatch`)
1. For the third resolution option above, I can't see any reason that adding `return a` to the inner `go` function should make the code compile while leaving it out makes the code somehow ambiguous. This, if nothing else, seems like a bug.7.10.1https://gitlab.haskell.org/ghc/ghc/-/issues/9626Test command lines munged on Windows when running on msys Python2019-07-07T18:39:46ZgintasTest command lines munged on Windows when running on msys PythonOn Windows, the test runner works fine if run under Windows-native Python, but fails with the msys Python because of the heuristic transformations that msys applies to all binary invocations of non-msys binaries (such as timeout.exe) by ...On Windows, the test runner works fine if run under Windows-native Python, but fails with the msys Python because of the heuristic transformations that msys applies to all binary invocations of non-msys binaries (such as timeout.exe) by msys binaries (such as python). This is relatively easy to sidestep by going through /usr/bin/cmd in msys which sidesteps the argument munging.
<details><summary>Trac metadata</summary>
| Trac field | Value |
| ---------------------- | ------------ |
| Version | 7.9 |
| Type | Bug |
| TypeOfFailure | OtherFailure |
| Priority | normal |
| Resolution | Unresolved |
| Component | Build System |
| Test case | |
| Differential revisions | |
| BlockedBy | |
| Related | |
| Blocking | |
| CC | |
| Operating system | |
| Architecture | |
</details>
<!-- {"blocked_by":[],"summary":"Test command lines munged on Windows when running on msys Python","status":"New","operating_system":"","component":"Build System","related":[],"milestone":"","resolution":"Unresolved","owner":{"tag":"Unowned"},"version":"7.9","keywords":[],"differentials":[],"test_case":"","architecture":"","cc":[""],"type":"Bug","description":"On Windows, the test runner works fine if run under Windows-native Python, but fails with the msys Python because of the heuristic transformations that msys applies to all binary invocations of non-msys binaries (such as timeout.exe) by msys binaries (such as python). This is relatively easy to sidestep by going through /usr/bin/cmd in msys which sidesteps the argument munging.","type_of_failure":"OtherFailure","blocking":[]} -->7.10.1https://gitlab.haskell.org/ghc/ghc/-/issues/9623Use Data.List.dropWhileEnd2019-07-07T18:39:46ZDavid FeuerUse Data.List.dropWhileEndThe GHC tree has many instances of `reverse . dropWhile ... . reverse`. As well as being harder to read and work with (searching for those forms led me to discover #9616) this approach is less efficient than `dropWhileEnd`. I think I've ...The GHC tree has many instances of `reverse . dropWhile ... . reverse`. As well as being harder to read and work with (searching for those forms led me to discover #9616) this approach is less efficient than `dropWhileEnd`. I think I've found all the places this is used, and I'll submit a patch to fix all the instances except for tests and nofib.
<details><summary>Trac metadata</summary>
| Trac field | Value |
| ---------------------- | ------------ |
| Version | 7.8.3 |
| Type | Task |
| TypeOfFailure | OtherFailure |
| Priority | normal |
| Resolution | Unresolved |
| Component | Compiler |
| Test case | |
| Differential revisions | |
| BlockedBy | |
| Related | |
| Blocking | |
| CC | |
| Operating system | |
| Architecture | |
</details>
<!-- {"blocked_by":[],"summary":"Use Data.List.dropWhileEnd","status":"New","operating_system":"","component":"Compiler","related":[],"milestone":"7.10.1","resolution":"Unresolved","owner":{"tag":"Unowned"},"version":"7.8.3","keywords":[],"differentials":[],"test_case":"","architecture":"","cc":[""],"type":"Task","description":"The GHC tree has many instances of `reverse . dropWhile ... . reverse`. As well as being harder to read and work with (searching for those forms led me to discover #9616) this approach is less efficient than `dropWhileEnd`. I think I've found all the places this is used, and I'll submit a patch to fix all the instances except for tests and nofib.","type_of_failure":"OtherFailure","blocking":[]} -->7.10.1David FeuerDavid Feuerhttps://gitlab.haskell.org/ghc/ghc/-/issues/9621New Data.Foldable methods2019-07-07T18:39:47ZHerbert Valerio Riedelhvr@gnu.orgNew Data.Foldable methodsSee http://thread.gmane.org/gmane.comp.lang.haskell.libraries/22828
The current version of the proposal at time of writing:
> Add the following to `Foldable`:
>
> - `length` — often stored as a separate field for //O(1)// access
> - `n...See http://thread.gmane.org/gmane.comp.lang.haskell.libraries/22828
The current version of the proposal at time of writing:
> Add the following to `Foldable`:
>
> - `length` — often stored as a separate field for //O(1)// access
> - `null` — called very often and slightly faster than `foldr (\_ _ -> False) True` for some containers
> - `toList` — may be the identity or nearly so, and this fact may not be statically available to the foldr/id rule
> - `sum`, `product` — may be cached internally in tree nodes for fast update, giving //O(1)// access; may be calculated in parallel.
> - `maximum`, `minimum` — //O(n)// for a search tree; //O(1)// for a finger tree.
> - `elem` — //O(log n)// for search trees; likely better for hash tables and such.
>
> - \*Don't\*\* add anything to `Traversable`, because `scanl1` and `scanr1` are not worth the extra dictionary weight.7.10.1Edward KmettEdward Kmetthttps://gitlab.haskell.org/ghc/ghc/-/issues/9610Missing fixity declaration for `Data.Foldable.{elem,notElem}`2019-07-07T18:39:49ZHerbert Valerio Riedelhvr@gnu.orgMissing fixity declaration for `Data.Foldable.{elem,notElem}``Data.Foldable.{elem,notElem}` is lacking the fixity declaration
```hs
infix 4 `elem`, `notElem`
```
to match their monomorphic `Data.List` counterparts' fixity.
<details><summary>Trac metadata</summary>
| Trac field | V...`Data.Foldable.{elem,notElem}` is lacking the fixity declaration
```hs
infix 4 `elem`, `notElem`
```
to match their monomorphic `Data.List` counterparts' fixity.
<details><summary>Trac metadata</summary>
| Trac field | Value |
| ---------------------- | -------------- |
| Version | 7.8.3 |
| Type | Bug |
| TypeOfFailure | OtherFailure |
| Priority | normal |
| Resolution | Unresolved |
| Component | libraries/base |
| Test case | |
| Differential revisions | |
| BlockedBy | |
| Related | |
| Blocking | |
| CC | ekmett, hvr |
| Operating system | |
| Architecture | |
</details>
<!-- {"blocked_by":[],"summary":"Missing fixity declaration for `Data.Foldable.{elem,notElem}`","status":"New","operating_system":"","component":"libraries/base","related":[],"milestone":"7.10.1","resolution":"Unresolved","owner":{"tag":"Unowned"},"version":"7.8.3","keywords":[],"differentials":[],"test_case":"","architecture":"","cc":["ekmett","hvr"],"type":"Bug","description":"`Data.Foldable.{elem,notElem}` is lacking the fixity declaration\r\n\r\n{{{#!hs\r\ninfix 4 `elem`, `notElem`\r\n}}}\r\n\r\nto match their monomorphic `Data.List` counterparts' fixity.","type_of_failure":"OtherFailure","blocking":[]} -->7.10.1https://gitlab.haskell.org/ghc/ghc/-/issues/9609GHCi gives overly specific error message for unknown constructor2019-07-07T18:39:50ZDavid FeuerGHCi gives overly specific error message for unknown constructorWhat happens:
```
Prelude> :i Fish
Top level: Not in scope: data constructor ‘Fish’
```
This is potentially confusing because `:i` can be used for type constructors and classes, as well as data constructors. What I think should happen...What happens:
```
Prelude> :i Fish
Top level: Not in scope: data constructor ‘Fish’
```
This is potentially confusing because `:i` can be used for type constructors and classes, as well as data constructors. What I think should happen:
```
Prelude> :i Fish
Top level: Not in scope: constructor or class ‘Fish’
```
<details><summary>Trac metadata</summary>
| Trac field | Value |
| ---------------------- | ------------ |
| Version | 7.8.2 |
| Type | Bug |
| TypeOfFailure | OtherFailure |
| Priority | normal |
| Resolution | Unresolved |
| Component | Compiler |
| Test case | |
| Differential revisions | |
| BlockedBy | |
| Related | |
| Blocking | |
| CC | |
| Operating system | |
| Architecture | |
</details>
<!-- {"blocked_by":[],"summary":"GHCi gives overly specific error message for unknown constructor","status":"New","operating_system":"","component":"Compiler","related":[],"milestone":"","resolution":"Unresolved","owner":{"tag":"Unowned"},"version":"7.8.2","keywords":[],"differentials":[],"test_case":"","architecture":"","cc":[""],"type":"Bug","description":"What happens:\r\n\r\n{{{\r\nPrelude> :i Fish\r\n\r\nTop level: Not in scope: data constructor ‘Fish’\r\n}}}\r\n\r\nThis is potentially confusing because `:i` can be used for type constructors and classes, as well as data constructors. What I think should happen:\r\n\r\n{{{\r\nPrelude> :i Fish\r\n\r\nTop level: Not in scope: constructor or class ‘Fish’\r\n}}}","type_of_failure":"OtherFailure","blocking":[]} -->7.10.1https://gitlab.haskell.org/ghc/ghc/-/issues/9605Misleading error message with forgotten "do"2019-07-07T18:39:51ZowstMisleading error message with forgotten "do"In the following (simplified) code, I forgot to add the do keyword, when doing some refactoring. This caused GHC to give a strange error message that said approximately
"The function F is applied to two arguments, but its type T has only...In the following (simplified) code, I forgot to add the do keyword, when doing some refactoring. This caused GHC to give a strange error message that said approximately
"The function F is applied to two arguments, but its type T has only two"... which is odd!
```hs
import Control.Monad.RWS ( evalRWS, RWS )
import Control.Monad.Writer.Class ( tell )
main = print $ evalRWS (go 1) () ()
go :: Int -> RWS () [String] () ()
go i = --Oops, forgot a do here
return (show i) >>= (\l -> tell [l])
-- go $ i + 1
go i
```
Strangely, replacing the "go i" line with the commented-out line above it gives a sensible error message, the "Possible cause: \`\\l -\> tell \[l\]' is applied to too many arguments" message, which is correct, and would've pointed me straight to the problem.
The invalid error message, which appears to be the same using GHC 7.6.3 and 7.8.3, is:
```
NFA.hs:8:25:
Couldn't match type ‘String
-> Control.Monad.Trans.RWS.Lazy.RWST
() [String] () Data.Functor.Identity.Identity ()’
with ‘()’
Expected type: Int
-> String
-> Control.Monad.Trans.RWS.Lazy.RWST
() [String] () Data.Functor.Identity.Identity ()
Actual type: Int -> ()
The function ‘\ l -> tell [l]’ is applied to two arguments,
but its type ‘(Int -> RWS () [String] () ()) -> Int -> ()’
has only two
In the second argument of ‘(>>=)’, namely ‘(\ l -> tell [l]) go i’
In the expression: return (show i) >>= (\ l -> tell [l]) go i
```
<details><summary>Trac metadata</summary>
| Trac field | Value |
| ---------------------- | ------------ |
| Version | 7.8.3 |
| Type | Bug |
| TypeOfFailure | OtherFailure |
| Priority | normal |
| Resolution | Unresolved |
| Component | Compiler |
| Test case | |
| Differential revisions | |
| BlockedBy | |
| Related | |
| Blocking | |
| CC | |
| Operating system | |
| Architecture | |
</details>
<!-- {"blocked_by":[],"summary":"Misleading error message with forgotten \"do\"","status":"New","operating_system":"","component":"Compiler","related":[],"milestone":"","resolution":"Unresolved","owner":{"tag":"Unowned"},"version":"7.8.3","keywords":[],"differentials":[],"test_case":"","architecture":"","cc":[""],"type":"Bug","description":"In the following (simplified) code, I forgot to add the do keyword, when doing some refactoring. This caused GHC to give a strange error message that said approximately\r\n\"The function F is applied to two arguments, but its type T has only two\"... which is odd!\r\n\r\n{{{#!hs\r\nimport Control.Monad.RWS ( evalRWS, RWS )\r\nimport Control.Monad.Writer.Class ( tell )\r\n\r\nmain = print $ evalRWS (go 1) () ()\r\n\r\ngo :: Int -> RWS () [String] () ()\r\ngo i = --Oops, forgot a do here\r\n return (show i) >>= (\\l -> tell [l])\r\n -- go $ i + 1\r\n go i\r\n}}}\r\n\r\nStrangely, replacing the \"go i\" line with the commented-out line above it gives a sensible error message, the \"Possible cause: `\\l -> tell [l]' is applied to too many arguments\" message, which is correct, and would've pointed me straight to the problem. \r\n\r\nThe invalid error message, which appears to be the same using GHC 7.6.3 and 7.8.3, is:\r\n\r\n{{{\r\nNFA.hs:8:25:\r\n Couldn't match type ‘String\r\n -> Control.Monad.Trans.RWS.Lazy.RWST\r\n () [String] () Data.Functor.Identity.Identity ()’\r\n with ‘()’\r\n Expected type: Int\r\n -> String\r\n -> Control.Monad.Trans.RWS.Lazy.RWST\r\n () [String] () Data.Functor.Identity.Identity ()\r\n Actual type: Int -> ()\r\n The function ‘\\ l -> tell [l]’ is applied to two arguments,\r\n but its type ‘(Int -> RWS () [String] () ()) -> Int -> ()’\r\n has only two\r\n In the second argument of ‘(>>=)’, namely ‘(\\ l -> tell [l]) go i’\r\n In the expression: return (show i) >>= (\\ l -> tell [l]) go i\r\n}}}","type_of_failure":"OtherFailure","blocking":[]} -->7.10.1YurasYurashttps://gitlab.haskell.org/ghc/ghc/-/issues/9604Python test runner assumes native Python on Windows2019-07-07T18:39:51ZgintasPython test runner assumes native Python on Windowsruntests.py assumes that ctypes.windll is always available when running on Windows, but that is in fact only available when using a native Windows Python, but not the mingw/msys Python. The code causes a crash over a trivial issue of set...runtests.py assumes that ctypes.windll is always available when running on Windows, but that is in fact only available when using a native Windows Python, but not the mingw/msys Python. The code causes a crash over a trivial issue of setting the terminal to UTF-8 mode.
See attached patch for a fix. (The second patch is a cleanup.)
<details><summary>Trac metadata</summary>
| Trac field | Value |
| ---------------------- | ------------ |
| Version | 7.8.2 |
| Type | Bug |
| TypeOfFailure | OtherFailure |
| Priority | normal |
| Resolution | Unresolved |
| Component | Build System |
| Test case | |
| Differential revisions | |
| BlockedBy | |
| Related | |
| Blocking | |
| CC | |
| Operating system | |
| Architecture | |
</details>
<!-- {"blocked_by":[],"summary":"Python test runner assumes native Python on Windows","status":"New","operating_system":"","component":"Build System","related":[],"milestone":"","resolution":"Unresolved","owner":{"tag":"Unowned"},"version":"7.8.2","keywords":[],"differentials":[],"test_case":"","architecture":"","cc":[""],"type":"Bug","description":"runtests.py assumes that ctypes.windll is always available when running on Windows, but that is in fact only available when using a native Windows Python, but not the mingw/msys Python. The code causes a crash over a trivial issue of setting the terminal to UTF-8 mode.\r\n\r\nSee attached patch for a fix. (The second patch is a cleanup.)","type_of_failure":"OtherFailure","blocking":[]} -->7.10.1https://gitlab.haskell.org/ghc/ghc/-/issues/9586Implement Traversable/Foldable-Burning-Bridges Proposal2019-07-07T18:39:55ZHerbert Valerio Riedelhvr@gnu.orgImplement Traversable/Foldable-Burning-Bridges ProposalMore details to follow. I've created this ticket to be able to refer to from related preparatory commits.
In a nutshell the FTP (Foldable/Traversable-Proposal) sub-goal of the BBP (Burning-Bridges-Proposal) includes to be able to compil...More details to follow. I've created this ticket to be able to refer to from related preparatory commits.
In a nutshell the FTP (Foldable/Traversable-Proposal) sub-goal of the BBP (Burning-Bridges-Proposal) includes to be able to compile code like the following w/o errors (due to conflicting definitions):
```hs
module XPrelude (module X) where
import Data.Foldable as X
import Data.Traversable as X
import Data.List as X
import Control.Monad as X
import Prelude as X
```
Other goals include to generalise/weaken type-signatures where possible w/o breaking (much) compatibility with existing code. An in-depth design-document is in the works.7.10.1Herbert Valerio Riedelhvr@gnu.orgHerbert Valerio Riedelhvr@gnu.orghttps://gitlab.haskell.org/ghc/ghc/-/issues/9584Interface file errors (Iface type variable out of scope: k)2019-09-12T13:46:33ZjonsterlingInterface file errors (Iface type variable out of scope: k)(Please forgive me if I have not formatted this bug report properly)
Anyway, yesterday in a project at work we started having a strange problem where pretty much any change in our code at all would result in the next build failing with ...(Please forgive me if I have not formatted this bug report properly)
Anyway, yesterday in a project at work we started having a strange problem where pretty much any change in our code at all would result in the next build failing with this error:
```
The interface for ‘main:HList’
Declaration for $fRLensk:r_$s$w$crlens:
Iface type variable out of scope: k
Cannot continue after interface file error
```
I can get around the problem by deleting the dist directory, but this is very unfortunate, since it basically changes my build/test cycle from a few seconds to a minutes because I can't take advantage of the cached builds of things that \*haven't\* changed. It seems like errors like this have cropped up a few times in GHC, but they've always been fixed so far, so hopefully someone here will be familiar with what is causing this one! Please let me know if there is further information I can provide.
The file in question looks basically like this: (it depends on some other stuff in our project, and so it won't build immediately if you paste it onto your machine; let me know if you need me to bundle it up into something self-contained).
```hs
-- | A bespoke record/HList type. 'el' interprets fields into types; 'tot' is
-- the maximal extension of the record type; and 'rs' is the subset of 'tot'
-- contained in the record itself.
data Record (el :: k -> *) (tot :: [k]) (rs :: [k]) where
Nil
:: Record el tot '[]
(:*)
:: ( ElemTF r tot ?? '("the key", r, "is not permitted in this record, which may only contain", tot)
, DistinctTF (r ': rs) ?? '("the key", r, "is already in", rs)
)
=> el r
-> Record el tot rs
-> Record el tot (r ': rs)
infixr 9 :*
-- | Records have lenses for their fields.
class ElemTF r rs ~ True => RLens rs r where
rlens
:: proxy r
-> CL.Lens' (Record el tot rs) (el r)
instance RLens (r ': rs) r where
rlens _ = CL.lens (\(x :* _) -> x) (\(_ :* xs) x -> x :* xs)
instance (ElemTF r (s ': rs) ~ True, RLens rs r) => RLens (s ': rs) r where
rlens _ = CL.lens (\(_ :* xs) -> xs ^. rlens Proxy) (\(x :* xs) y -> x :* xs & rlens Proxy .~ y)
-- | Records with fields in 'K' give rise to a functor from 'Hask^K' to 'Hask'.
(<<$>>)
:: (forall x. f x -> g x)
-> Record f tot rs
-> Record g tot rs
_ <<$>> Nil = Nil
eta <<$>> (x :* xs) = eta x :* (eta <<$>> xs)
infixl 8 <<$>>
-- | Records can be traversed to pull out some of their effects.
rtraverse
:: Applicative h
=> (forall x. f x -> h (g x))
-> Record f tot rs
-> h (Record g tot rs)
rtraverse _ Nil = pure Nil
rtraverse f (x :* xs) = (:*) <$> f x <*> rtraverse f xs
-- | As a special case, we can yank out the first layer of effects in a
-- composed functor stack.
rtraverse1
:: Applicative f
=> Record (f :. g) tot rs
-> f (Record g tot rs)
rtraverse1 = rtraverse getCompose
-- | Records whose fields are uniform in type may be turned into a list.
recordToList :: Record (Const t) tbl rs -> [t]
recordToList Nil = []
recordToList (Const x :* xs) = x : recordToList xs
instance Show (Record el tot '[]) where
show _ = "Nil"
instance ( Show (Record el tot rs)
, Show (el r)
) => Show (Record el tot (r ': rs)) where
show (x :* xs) = "(" ++ show x ++ " :* " ++ show xs ++ ")"
data family Sing (a :: k)
class SingI a where
sing :: Sing a
class kparam ~ Any => SingE (kparam :: k) rep | kparam -> rep where
fromSing :: Sing (a :: k) -> rep
```
<details><summary>Trac metadata</summary>
| Trac field | Value |
| ---------------------- | ------------ |
| Version | 7.8.3 |
| Type | Bug |
| TypeOfFailure | OtherFailure |
| Priority | normal |
| Resolution | Unresolved |
| Component | Compiler |
| Test case | |
| Differential revisions | |
| BlockedBy | |
| Related | |
| Blocking | |
| CC | |
| Operating system | |
| Architecture | |
</details>
<!-- {"blocked_by":[],"summary":"Interface file errors (Iface type variable out of scope: k)","status":"New","operating_system":"","component":"Compiler","related":[],"milestone":"","resolution":"Unresolved","owner":{"tag":"Unowned"},"version":"7.8.3","keywords":[],"differentials":[],"test_case":"","architecture":"","cc":[""],"type":"Bug","description":"(Please forgive me if I have not formatted this bug report properly)\r\n\r\nAnyway, yesterday in a project at work we started having a strange problem where pretty much any change in our code at all would result in the next build failing with this error:\r\n\r\n{{{\r\nThe interface for ‘main:HList’\r\nDeclaration for $fRLensk:r_$s$w$crlens:\r\n Iface type variable out of scope: k\r\nCannot continue after interface file error\r\n}}}\r\n\r\nI can get around the problem by deleting the dist directory, but this is very unfortunate, since it basically changes my build/test cycle from a few seconds to a minutes because I can't take advantage of the cached builds of things that *haven't* changed. It seems like errors like this have cropped up a few times in GHC, but they've always been fixed so far, so hopefully someone here will be familiar with what is causing this one! Please let me know if there is further information I can provide.\r\n\r\nThe file in question looks basically like this: (it depends on some other stuff in our project, and so it won't build immediately if you paste it onto your machine; let me know if you need me to bundle it up into something self-contained).\r\n\r\n{{{#!hs\r\n-- | A bespoke record/HList type. 'el' interprets fields into types; 'tot' is\r\n-- the maximal extension of the record type; and 'rs' is the subset of 'tot'\r\n-- contained in the record itself.\r\ndata Record (el :: k -> *) (tot :: [k]) (rs :: [k]) where\r\n Nil\r\n :: Record el tot '[]\r\n (:*)\r\n :: ( ElemTF r tot ?? '(\"the key\", r, \"is not permitted in this record, which may only contain\", tot)\r\n , DistinctTF (r ': rs) ?? '(\"the key\", r, \"is already in\", rs)\r\n )\r\n => el r\r\n -> Record el tot rs\r\n -> Record el tot (r ': rs)\r\ninfixr 9 :*\r\n\r\n-- | Records have lenses for their fields.\r\nclass ElemTF r rs ~ True => RLens rs r where\r\n rlens\r\n :: proxy r\r\n -> CL.Lens' (Record el tot rs) (el r)\r\n\r\ninstance RLens (r ': rs) r where\r\n rlens _ = CL.lens (\\(x :* _) -> x) (\\(_ :* xs) x -> x :* xs)\r\n\r\ninstance (ElemTF r (s ': rs) ~ True, RLens rs r) => RLens (s ': rs) r where\r\n rlens _ = CL.lens (\\(_ :* xs) -> xs ^. rlens Proxy) (\\(x :* xs) y -> x :* xs & rlens Proxy .~ y)\r\n\r\n\r\n-- | Records with fields in 'K' give rise to a functor from 'Hask^K' to 'Hask'.\r\n(<<$>>)\r\n :: (forall x. f x -> g x)\r\n -> Record f tot rs\r\n -> Record g tot rs\r\n_ <<$>> Nil = Nil\r\neta <<$>> (x :* xs) = eta x :* (eta <<$>> xs)\r\ninfixl 8 <<$>>\r\n\r\n-- | Records can be traversed to pull out some of their effects.\r\nrtraverse\r\n :: Applicative h\r\n => (forall x. f x -> h (g x))\r\n -> Record f tot rs\r\n -> h (Record g tot rs)\r\nrtraverse _ Nil = pure Nil\r\nrtraverse f (x :* xs) = (:*) <$> f x <*> rtraverse f xs\r\n\r\n-- | As a special case, we can yank out the first layer of effects in a\r\n-- composed functor stack.\r\nrtraverse1\r\n :: Applicative f\r\n => Record (f :. g) tot rs\r\n -> f (Record g tot rs)\r\nrtraverse1 = rtraverse getCompose\r\n\r\n-- | Records whose fields are uniform in type may be turned into a list.\r\nrecordToList :: Record (Const t) tbl rs -> [t]\r\nrecordToList Nil = []\r\nrecordToList (Const x :* xs) = x : recordToList xs\r\n\r\ninstance Show (Record el tot '[]) where\r\n show _ = \"Nil\"\r\n\r\ninstance ( Show (Record el tot rs)\r\n , Show (el r)\r\n ) => Show (Record el tot (r ': rs)) where\r\n show (x :* xs) = \"(\" ++ show x ++ \" :* \" ++ show xs ++ \")\"\r\n\r\n\r\ndata family Sing (a :: k)\r\nclass SingI a where\r\n sing :: Sing a\r\n\r\nclass kparam ~ Any => SingE (kparam :: k) rep | kparam -> rep where\r\n fromSing :: Sing (a :: k) -> rep\r\n}}}","type_of_failure":"OtherFailure","blocking":[]} -->7.10.1https://gitlab.haskell.org/ghc/ghc/-/issues/9582Associated Type Synonyms do not unfold in InstanceSigs2020-12-02T21:56:59Zandreas.abelAssociated Type Synonyms do not unfold in InstanceSigs```hs
{-# LANGUAGE InstanceSigs, TypeFamilies #-}
class C a where
type T a
m :: T a
instance C Int where
type T Int = String
m :: String
m = "bla"
-- Method signature does not match class; it should be m :: T Int
-- In th...```hs
{-# LANGUAGE InstanceSigs, TypeFamilies #-}
class C a where
type T a
m :: T a
instance C Int where
type T Int = String
m :: String
m = "bla"
-- Method signature does not match class; it should be m :: T Int
-- In the instance declaration for ‘C Int’
```
As `T Int` is a synonym of `String`, `m :: String` should be a valid type signature alternative to `m :: T Int`
<details><summary>Trac metadata</summary>
| Trac field | Value |
| ---------------------- | ----------------------- |
| Version | 7.8.3 |
| Type | Bug |
| TypeOfFailure | OtherFailure |
| Priority | normal |
| Resolution | Unresolved |
| Component | Compiler (Type checker) |
| Test case | |
| Differential revisions | |
| BlockedBy | |
| Related | |
| Blocking | |
| CC | |
| Operating system | |
| Architecture | |
</details>
<!-- {"blocked_by":[],"summary":"Associated Type Synonyms do not unfold in InstanceSigs","status":"New","operating_system":"","component":"Compiler (Type checker)","related":[],"milestone":"","resolution":"Unresolved","owner":{"tag":"Unowned"},"version":"7.8.3","keywords":["InstanceSigs","TypeFamilies"],"differentials":[],"test_case":"","architecture":"","cc":[""],"type":"Bug","description":"{{{#!hs\r\n{-# LANGUAGE InstanceSigs, TypeFamilies #-}\r\n\r\nclass C a where\r\n type T a\r\n m :: T a\r\n\r\ninstance C Int where\r\n type T Int = String\r\n m :: String\r\n m = \"bla\"\r\n\r\n-- Method signature does not match class; it should be m :: T Int\r\n-- In the instance declaration for ‘C Int’\r\n}}}\r\n\r\nAs {{{T Int}}} is a synonym of {{{String}}}, {{{m :: String}}} should be a valid type signature alternative to {{{m :: T Int}}}","type_of_failure":"OtherFailure","blocking":[]} -->7.10.1https://gitlab.haskell.org/ghc/ghc/-/issues/9578Quoting issue in configure.ac2019-07-07T18:39:57ZgintasQuoting issue in configure.acSome ghc invocations in configure.ac are not properly quoted, causing ./configure to spew errors if there are spaces in the path. See attached patch.
<details><summary>Trac metadata</summary>
| Trac field | Value |
|...Some ghc invocations in configure.ac are not properly quoted, causing ./configure to spew errors if there are spaces in the path. See attached patch.
<details><summary>Trac metadata</summary>
| Trac field | Value |
| ---------------------- | ------------ |
| Version | 7.9 |
| Type | Bug |
| TypeOfFailure | OtherFailure |
| Priority | normal |
| Resolution | Unresolved |
| Component | Build System |
| Test case | |
| Differential revisions | |
| BlockedBy | |
| Related | |
| Blocking | |
| CC | |
| Operating system | |
| Architecture | |
</details>
<!-- {"blocked_by":[],"summary":"Quoting issue in configure.ac","status":"New","operating_system":"","component":"Build System","related":[],"milestone":"","resolution":"Unresolved","owner":{"tag":"Unowned"},"version":"7.9","keywords":[],"differentials":[],"test_case":"","architecture":"","cc":[""],"type":"Bug","description":"Some ghc invocations in configure.ac are not properly quoted, causing ./configure to spew errors if there are spaces in the path. See attached patch.","type_of_failure":"OtherFailure","blocking":[]} -->7.10.1https://gitlab.haskell.org/ghc/ghc/-/issues/9561Clean up mergeSATInfo2019-07-07T18:40:01ZDavid FeuerClean up mergeSATInfo`mergeSATInfo` in SAT.hs is much longer and harder to read than it needs to be. I am attaching a patch to make it use `zipWith` instead of zipping manually.
<details><summary>Trac metadata</summary>
| Trac field | Value ...`mergeSATInfo` in SAT.hs is much longer and harder to read than it needs to be. I am attaching a patch to make it use `zipWith` instead of zipping manually.
<details><summary>Trac metadata</summary>
| Trac field | Value |
| ---------------------- | ------------ |
| Version | 7.9 |
| Type | Task |
| TypeOfFailure | OtherFailure |
| Priority | normal |
| Resolution | Unresolved |
| Component | Compiler |
| Test case | |
| Differential revisions | |
| BlockedBy | |
| Related | |
| Blocking | |
| CC | |
| Operating system | |
| Architecture | |
</details>
<!-- {"blocked_by":[],"summary":"Clean up mergeSATInfo","status":"New","operating_system":"","component":"Compiler","related":[],"milestone":"7.8.4","resolution":"Unresolved","owner":{"tag":"Unowned"},"version":"7.9","keywords":[],"differentials":[],"test_case":"","architecture":"","cc":[""],"type":"Task","description":"`mergeSATInfo` in SAT.hs is much longer and harder to read than it needs to be. I am attaching a patch to make it use `zipWith` instead of zipping manually.","type_of_failure":"OtherFailure","blocking":[]} -->7.10.1https://gitlab.haskell.org/ghc/ghc/-/issues/9550Add uncons to Data.List2019-07-07T18:40:03ZDavid FeuerAdd uncons to Data.ListThis was [discussed on the libraries list](http://www.haskell.org/pipermail/libraries/2014-July/023314.html) and favourably receivedThis was [discussed on the libraries list](http://www.haskell.org/pipermail/libraries/2014-July/023314.html) and favourably received7.10.1