{-# LANGUAGE UndecidableInstances #-}{-# LANGUAGE PolyKinds #-}{-# LANGUAGE TypeOperators #-}{-# LANGUAGE TypeFamilies #-}{-# LANGUAGE DataKinds #-}moduleLibwhereimportGHC.TypeLitsdataPlusMinusg=Plusg|Minusg|NonegdataGrade=A|B|C|D|Finfixr5:->dataGradeMappingminScoregrade=minScore:->gradetypeStandardGradingCurve='[90:->A,80:->B,70:->C,60:->D,0:->F]typefamilyLookupGrade(c::[GradeMappingscoregrade])(s::score)::gradewhereLookupGrademk=LookupGrade'mkktypefamilyLookupGrade'(c::[GradeMappingscoregrade])(s::score)(s'::score)::gradewhereLookupGrade''[]kk'=FLookupGrade'((k:->v)':c)kk'=vLookupGrade'((k:->v)':c)0k'=LookupGrade'ck'k'LookupGrade'((k:->v)':c)nk'=LookupGrade'((k:->v)':c)(n-1)k'LookupGrade'((kvm)':c)kk'=LookupGrade'ckk'typefamilyIfThenElse(cond::Bool)(whenTrue::b)(whenFalse::b)::bwhereIfThenElseTruetrueBranchfalseBranch=trueBranchIfThenElseFalsetrueBranchfalseBranch=falseBranchtypefamilyLessThan(a::Nat)(b::Nat)::BoolwhereLessThanaa=FalseLessThana0=FalseLessThan0b=TrueLessThanab=LessThan(a-1)(b-1)typefamilyOnesFamily(n::Nat)::NatwhereOnesFamily0=0OnesFamilyn=IfThenElse(LessThann10)n(OnesFamily(n-10))typefamilyMakePlusMinus(n::Nat)(val::a)::PlusMinusawhereMakePlusMinusscoreval=IfThenElse(LessThan(OnesFamilyscore)5)(Minusval)(IfThenElse(LessThan5(OnesFamilyscore))(Plusval)(Noneval))typefamilySum(vals::[Nat])::NatwhereSumvals=Sum'0valstypefamilySum'(total::Nat)(vals::[Nat])::NatwhereSum'n'[]=nSum'n(a':as)=Sum'(n+a)astypefamilyLength(vals::[a])::NatwhereLength'[]=0Length(val':vals)=1+(Lengthvals)typefamilyMean(vals::[Nat])::NatwhereMeanvals=Div(Sumvals)(Lengthvals)typefamilyCalcGrade(vals::[Nat])::PlusMinusGradewhereCalcGradevals=MakePlusMinus(Meanvals)(LookupGradeStandardGradingCurve(Meanvals))
For further actions, you may consider blocking this person and/or reporting abuse
We're a place where coders share, stay up-to-date and grow their careers.
Here's my type-level implementation in haskell: