Libraries that support eta conversion.
Generates a new function that can be eta conversion from function.
Install with Spago:
spago install eta-conversion
Suppose you have the following data structure Result and function fun and a function called exampleA1 that uses them.
newtype Result a = Result a
fun :: String -> Int -> Boolean -> String
fun _ _ _ = ""
exampleA1 :: String -> Int -> Boolean -> Result String
exampleA1 s i b = Result $ fun s i bBy using the <<| operator for this exampleA1 function, the following eta conversion can be performed.
import Data.EtaConversionTransformer ((<<|))
exampleA2 :: String -> Int -> Boolean -> Result String
exampleA2 = Result <<| funThis works the same as if you had written.
exampleA2 = \s i b -> Result $ fun s i bThat is, a <<| f creates a new function that has the same arguments as function f and returns the result of applying those arguments to f and passing it to function a.
<<| signature as follows when there is only one argument.
(o -> ret) -> (a1 -> o) -> (a1 -> ret)If there are two arguments, signature is as follows.
(o -> ret) -> (a1 -> a2 -> o) -> (a1 -> a2 -> ret)When there are three or more arguments, the number of arguments in the signature increases in the same pattern as above.
<<| supports up to 9 arguments.
The rotate function can be used to generate a new function with a shifted argument definition as follows.
import Data.ArgsRotater (rotate)
fun :: String -> Int -> Boolean -> String
fun _ _ _ = ""
example :: Boolean -> String -> Int -> String
example = rotate funThe <^ operator can be used to create a new function with the last argument already applied.
import Data.ArgsRotater ((<^))
fun :: String -> Int -> Boolean -> String
fun _ _ _ = ""
example :: String -> Int -> String
example = fun <^ true -- last args applied functionSuppose we have the following data structures Result,Functions, a function runFunctions to retrieve the contents of Functions, and a function exampleB1 to use them.
newtype Result a = Result a
newtype Functions = Functions {
fun :: String -> Int -> Boolean -> String
}
runFunctions :: Functions -> { fun :: String -> Int -> Boolean -> String }
runFunctions (Functions r) = r
exampleB1 :: String -> Int -> Boolean -> Result (Functions -> String)
exampleB1 s i b = Result $ (\f -> f.fun s i b) <<< runFunctionsUsing the <<: operator, this exampleB1 can be defined as follows.
import Data.EtaConversionTransformer ((<<:))
exampleB2 :: String -> Int -> Boolean -> Result (Functions -> String)
exampleB2 = Result <<: _.fun <<< runFunctionsGenerate a "function to generate a ReaderT that would take a function out of the environment and use it"
Suppose we want to generate a ReaderT that takes a record with a function as its environment and uses that function internally as follows.
exampleC1 :: forall r m. TypeEquals r { fun :: String -> m Unit } => String -> ReaderT r m Unit
exampleC1 s = ReaderT $ \r -> (to r).fun sSuch a function can be written using the readerT function as follows.
import Data.ReaderTEtaConversionTransformer (readerT)
exampleC2 :: forall r m. TypeEquals r { fun :: String -> m Unit } => String -> ReaderT r m Unit
exampleC2 = readerT _.fun