here is some surprising behavior seen with ghc 8.6.5 (Haskell compiler).

in the function "answer" at the end:

- infix dollar sign works
- using ($$) which is equal to ($) fails
- defining ($$$) exactly as ($) is defined in Prelude fails
- prefix dollar sign fails

in failures, always same two error messages, abbreviated here:

```
* Couldn't match type `m' with `m0'
* No instance for (KnownNat m0) arising from a use of `five'
```

i suspect infix $ is not a normal function; it seems to be getting special treatment by ghc.

`{-# LANGUAGE RankNTypes #-}`

-- next two needed for type signature of ($$$)

{-# LANGUAGE KindSignatures #-}

{-# LANGUAGE PolyKinds #-}

module Main where {

import qualified Numeric.Modular; -- https://hackage.haskell.org/package/modular

import GHC.TypeNats(KnownNat);

import GHC.Exts(TYPE);

main :: IO();

main = undefined;

five :: forall m . KnownNat m => Numeric.Modular.Mod m;

five = Numeric.Modular.mkMod 5;

mod3 :: (forall m . KnownNat m => Numeric.Modular.Mod m) -> Integer;

mod3 = Numeric.Modular.withMod 3;

($$) = ($);

-- copy the definition of ($) from Prelude

infixr 0 $$$;

($$$) :: forall r a (b :: TYPE r). (a -> b) -> a -> b;

f $$$ x = f x;

{-# INLINE ($$$) #-}; -- the semicolon is necessary!

-- compute 5 `mod`

3 = 2

answer :: Integer;

-- answer = mod3 five; -- works

answer = mod3 $ five; -- works

-- answer = mod3 $$ five; -- fails to compile

-- answer = mod3 $$$ five; -- fails to compile

-- answer = ($) mod3 five; -- fails to compile

} --end

## No comments :

Post a Comment