1
1
mirror of https://github.com/anoma/juvix.git synced 2024-11-09 22:11:27 +03:00
juvix/.hlint.yaml
Jan Mas Rovira 2d666fd82c
Named arguments (#2250)
- closes #1991 

This pr implements named arguments as described in #1991. It does not
yet implement optional arguments, which should be added in a later pr as
they are not required for record syntax.

# Syntax Overview

Named arguments are a convenient mehcanism to provide arguments, where
we give the arguments by name instead of by position. Anything with a
type signature can have named arguments, i.e. functions, types,
constructors and axioms.

For instance, if we have (note that named arguments can also appear on
the rhs of the `:`):
```
fun : {A B : Type} (f : A -> B) : (x : A) -> B := ... ;
```
With the traditional positional application, we would write
```
fun suc zero
```
With named arguments we can write the following:
1. `fun (f := suc) (x := zero)`.
2. We can change the order: `fun (x := zero) (f := suc)`.
3. We can group the arguments: `fun (x := zero; f := suc)`.
4. We can partially apply functions with named arguments: `fun (f :=
suc) zero`.
5. We can provide implicit arguments analogously (with braces): `fun {A
:= Nat; B := Nat} (f := suc; x := zero)`.
6. We can skip implicit arguments: `fun {B := Nat} (f := suc; x :=
zero)`.

What we cannot do:
1. Skip explicit arguments. E.g. `fun (x := zero)`.
2. Mix explicit and implicit arguments in the same group. E.g. `fun (A
:= Nat; f := suc)`
3. Provide explicit and implicit arguments in different order. E.g. `fun
(f := suc; x := zero) {A := Nat}`.
2023-07-18 10:32:34 +01:00

90 lines
2.9 KiB
YAML

# Based on HLint configuration file from https://github.com/ndmitchell/hlint
- arguments: [--color]
# ------------------------------------------------------------------------------
# RESTRICTIONS
# ------------------------------------------------------------------------------
- extensions:
- default: false
- name:
- ApplicativeDo
- DataKinds
- DerivingStrategies
- GADTs
- ImportQualifiedPost
- LambdaCase
- NoImplicitPrelude
- OverloadedStrings
- QuantifiedConstraints
- QuasiQuotes
- RecordWildCards
- StandaloneKindSignatures
- TemplateHaskell
- TypeFamilyDependencies
- UndecidableInstances
- UnicodeSyntax
- GeneralizedNewtypeDeriving
- flags:
- default: false
- name:
- -Wall
- -Wcompat
- -Wderiving-defaults
- -Widentities
- -Wincomplete-patterns
- -Wincomplete-record-updates
- -Wincomplete-uni-patterns
- -Wmissing-deriving-strategies
- -Wredundant-constraints
- -O2 -flate-specialise -fspecialise-aggressively
- modules:
# if you import Data.Set qualified, it must be as 'Set'
- { name: [Data.Set, Data.HashSet], as: Set }
- { name: [Data.Map, Data.HashMap.Strict, Data.HashMap.Lazy], as: Map }
# - {name: Control.Arrow, within: []} # Certain modules are banned entirely
- functions:
- { name: Data.List.NonEmpty.nub, within: [] }
- { name: Data.List.NonEmpty.nubBy, within: [] }
# ------------------------------------------------------------------------------
# OTHER HINTS
# ------------------------------------------------------------------------------
# - warn: {name: Use explicit module export list}
# ------------------------------------------------------------------------------
# HINTS
# ------------------------------------------------------------------------------
- error: { lhs: idea Warning, rhs: warn }
- error: { lhs: idea Suggestion, rhs: suggest }
- error: { lhs: ideaN Warning, rhs: warnN }
- error: { lhs: ideaN Suggestion, rhs: suggestN }
- error: { lhs: occNameString (occName (unLoc x)), rhs: rdrNameStr x }
- error: { lhs: occNameString (occName x), rhs: occNameStr x }
- error:
{
lhs: noLoc (HsVar noExtField (noLoc (mkRdrUnqual (mkVarOcc x)))),
rhs: strToVar x,
}
# ------------------------------------------------------------------------------
# IGNORES
# ------------------------------------------------------------------------------
- ignore: { name: Use let, within: [Test.All] }
- ignore: { name: Use String }
- ignore: { name: Avoid restricted qualification }
- ignore: { name: Redundant multi-way if }
- ignore: { name: Redundant bracket }
- ignore: { name: Eta reduce }
- ignore: { name: Avoid restricted alias }
- ignore: { name: Use tuple-section }
- ignore: { name: Use map with tuple-section }