diff --git a/CHANGELOG.md b/CHANGELOG.md
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -17,3 +17,9 @@
 
 * Third version. Added new functions with the 1 in their names to deal with apropos (in some way) framed by two delimiters
 variants of the groups. Some code improvements, reduced duplications, changed pragmas INLINE to INLINABLE.
+
+## 0.3.1.0 -- 2021-12-30
+
+* Third version revised A. Added some more general functions to process arrays,
+type synonyms to improve code readability, reduced code duplication.
+
diff --git a/CLI/Arguments.hs b/CLI/Arguments.hs
--- a/CLI/Arguments.hs
+++ b/CLI/Arguments.hs
@@ -31,6 +31,10 @@
 
 type GQtyArgs = Int
 
+type FirstCharacter = Char
+
+type FirstChars = (Char,Char)
+
 instance Show Arguments where
   show (A xs) = xs
   show (B n ys yss) = ' ':ys `mappend` concatMap (\xs ->' ':show xs) (take n yss)
@@ -110,7 +114,7 @@
 ------------------------------------------------
 
 args2Args1
-  :: (Char,Char) -- ^ A pair of the first characters of the starting group delimiter (the same for all 'String's in the all 'CLSpecifications') and the probable its modification (the first character of the last delimiter).
+  :: FirstChars -- ^ A pair of the first characters of the starting group delimiter (the same for all 'String's in the all 'CLSpecifications') and the probable its modification (the first character of the last delimiter).
   -> CLSpecifications
   -> [String]
   ->  Args
@@ -128,7 +132,7 @@
 args2Args1 _ _ [] = []
 
 args2Args3'1
-  :: (Char,Char) -- ^ A pair of the first characters of the starting group delimiter (the same for all 'String's in the all 'CLSpecifications') and the probable its modification (the first character of the last delimiter).
+  :: FirstChars -- ^ A pair of the first characters of the starting group delimiter (the same for all 'String's in the all 'CLSpecifications') and the probable its modification (the first character of the last delimiter).
   -> (Args,Args,Args)
   -> CLSpecifications
   -> [String]
@@ -147,7 +151,7 @@
 args2Args3'1 _ (w1,w2,w3) _ [] = (w1,w2,w3)
 
 args2Args31
-  :: (Char,Char) -- ^ A pair of the first characters of the starting group delimiter (the same for all 'String's in the all 'CLSpecifications') and the probable its modification (the first character of the last delimiter).
+  :: FirstChars -- ^ A pair of the first characters of the starting group delimiter (the same for all 'String's in the all 'CLSpecifications') and the probable its modification (the first character of the last delimiter).
   -> CLSpecifications
   -> [String]
   -> (Args,Args,Args)
@@ -167,7 +171,7 @@
 
 -- | This function can actually parse the command line arguments being the ['String'].
 args2ArgsFilteredG1
-  :: (Char,Char) -- ^ A pair of the first characters of the starting group delimiter (the same for all 'String's in the all 'CLSpecifications') and the probable its modification (the first character of the last delimiter).
+  :: FirstChars -- ^ A pair of the first characters of the starting group delimiter (the same for all 'String's in the all 'CLSpecifications') and the probable its modification (the first character of the last delimiter).
   -> (Arguments -> Bool) -- ^ A predicate to check which 'Arguments' must be kept in the result.
   -> CLSpecifications
   -> [String]
@@ -191,7 +195,7 @@
 {-# INLINABLE takeCs #-}
 
 takeCs1
-  :: (Char,Char) -- ^ A pair of the first characters of the starting group delimiter (the same for all 'String's in the all 'CLSpecifications') and the probable its modification (the first character of the last delimiter).
+  :: FirstChars -- ^ A pair of the first characters of the starting group delimiter (the same for all 'String's in the all 'CLSpecifications') and the probable its modification (the first character of the last delimiter).
   -> CLSpecifications
   -> [String]
   -> Args
@@ -224,7 +228,7 @@
 {-# INLINABLE takeArgsSortedBy #-}
 
 takeArgs1SortedBy
-  :: (Char,Char) -- ^ A pair of the first characters of the starting group delimiter (the same for all 'String's in the all 'CLSpecifications') and the probable its modification (the first character of the last delimiter).
+  :: FirstChars -- ^ A pair of the first characters of the starting group delimiter (the same for all 'String's in the all 'CLSpecifications') and the probable its modification (the first character of the last delimiter).
   -> (Arguments -> Bool) -- ^ A predicate to check which 'Arguments' must be kept in the result.
   -> (Arguments -> Arguments -> Ordering) -- ^ A 'compare'-like implementation for 'Arguments'. If needed you can implement your own 'Ord' instance for 'Arguments' and use it here. Here can be partial, just for 'C's.
   -> CLSpecifications
@@ -242,7 +246,7 @@
 {-# INLINABLE takeCsSortedBy #-}
 
 takeCs1SortedBy
-  :: (Char,Char) -- ^ A pair of the first characters of the starting group delimiter (the same for all 'String's in the all 'CLSpecifications') and the probable its modification (the first character of the last delimiter).
+  :: FirstChars -- ^ A pair of the first characters of the starting group delimiter (the same for all 'String's in the all 'CLSpecifications') and the probable its modification (the first character of the last delimiter).
   -> (Arguments -> Arguments -> Ordering) -- ^ A 'compare'-like implementation for 'Arguments'. If needed you can implement your own 'Ord' instance for 'Arguments' and use it here. Here can be partial, just for 'C's.
   -> CLSpecifications
   -> [String]
@@ -268,101 +272,107 @@
 
 ------------------------------------------------------
 
+-- | For empty list of 'String's returns empty array that has no elements. Trying to index it always returns error and can cause
+-- segmentation fault in the running program or interpreter (GHCi).
+takeABCsArr
+  :: (CLSpecifications -> [String] -> Args) -- ^ A function to collect the 'Args'
+  -> CLSpecifications
+  -> [String]
+  -> Array Int Arguments
+takeABCsArr f ts xss = listArray (0,l-1) js
+     where js = f ts xss
+           l = length js
+{-# INLINABLE takeABCsArr #-}
+
+-- | For empty list of 'String's returns empty array that has no elements. Trying to index it always returns error and can cause
+-- segmentation fault in the running program or interpreter (GHCi).
 takeCsArr
   :: CLSpecifications
   -> [String]
   -> Array Int Arguments
-takeCsArr ts xss
- | null xss = error "CLI.Arguments.takeCsArr: Empty list of 'String's."
- | otherwise = listArray (0,l-1) js
-     where js = takeCs ts xss
-           l = length js
+takeCsArr = takeABCsArr takeCs
 {-# INLINABLE takeCsArr #-}
 
+-- | For empty list of 'String's returns empty array that has no elements. Trying to index it always returns error and can cause
+-- segmentation fault in the running program or interpreter (GHCi).
 takeCs1Arr
-  :: (Char,Char) -- ^ A pair of the first characters of the starting group delimiter (the same for all 'String's in the all 'CLSpecifications') and the probable its modification (the first character of the last delimiter).
+  :: FirstChars -- ^ A pair of the first characters of the starting group delimiter (the same for all 'String's in the all 'CLSpecifications') and the probable its modification (the first character of the last delimiter).
   -> CLSpecifications
   -> [String]
   -> Array Int Arguments
-takeCs1Arr (x1,x2) ts xss
- | null xss = error "CLI.Arguments.takeCs1Arr: Empty list of 'String's."
- | otherwise = listArray (0,l-1) js
-     where js = takeCs1 (x1,x2) ts xss
-           l = length js
+takeCs1Arr (x1,x2) = takeABCsArr (takeCs1 (x1,x2))
 {-# INLINABLE takeCs1Arr #-}
 
+-- | For empty list of 'String's returns empty array that has no elements. Trying to index it always returns error and can cause
+-- segmentation fault in the running program or interpreter (GHCi).
 takeBsArr
   :: CLSpecifications
   -> [String]
   -> Array Int Arguments
-takeBsArr ts xss
- | null xss = error "CLI.Arguments.takeBsArr: Empty list of 'String's."
- | otherwise = listArray (0,l-1) js
-     where js = takeBs ts xss
-           l = length js
+takeBsArr = takeABCsArr takeBs
 {-# INLINABLE takeBsArr #-}
 
+-- | For empty list of 'String's returns empty array that has no elements. Trying to index it always returns error and can cause
+-- segmentation fault in the running program or interpreter (GHCi).
 takeAsArr
   :: CLSpecifications
   -> [String]
   -> Array Int Arguments
-takeAsArr ts xss
- | null xss = error "CLI.Arguments.takeAsArr: Empty list of 'String's."
- | otherwise = listArray (0,l-1) js
-     where js = takeAs ts xss
-           l = length js
+takeAsArr  = takeABCsArr takeAs
 {-# INLINABLE takeAsArr #-}
 
 ---------------------------------------------------
 
+-- | For empty list of 'String's returns empty array that has no elements. Trying to index it always returns error and can cause
+-- segmentation fault in the running program or interpreter (GHCi).
+takeABCsArrSortedBy
+  :: ((Arguments -> Arguments -> Ordering) -> CLSpecifications -> [String] -> Args)
+  -> (Arguments -> Arguments -> Ordering) -- ^ A 'compare'-like implementation for 'Arguments'. If needed you can implement your own 'Ord' instance for 'Arguments' and use it here. Here can be partial, just for 'C's.
+  -> CLSpecifications
+  -> [String]
+  -> Array Int Arguments
+takeABCsArrSortedBy g f ts xss = listArray (0,l-1) js
+     where js = g f  ts xss
+           l = length js
+{-# INLINABLE takeABCsArrSortedBy #-}
+
+-- | For empty list of 'String's returns empty array that has no elements. Trying to index it always returns error and can cause
+-- segmentation fault in the running program or interpreter (GHCi).
 takeCsArrSortedBy
   :: (Arguments -> Arguments -> Ordering) -- ^ A 'compare'-like implementation for 'Arguments'. If needed you can implement your own 'Ord' instance for 'Arguments' and use it here. Here can be partial, just for 'C's.
   -> CLSpecifications
   -> [String]
   -> Array Int Arguments
-takeCsArrSortedBy f ts xss
- | null xss = error "CLI.Arguments.takeCsArrSortedBy: Empty list of 'String's."
- | otherwise = listArray (0,l-1) js
-     where js = takeArgsSortedBy (\x -> notNullArguments x && isC x) f  ts xss
-           l = length js
+takeCsArrSortedBy = takeABCsArrSortedBy (takeArgsSortedBy (\x -> notNullArguments x && isC x))
 {-# INLINABLE takeCsArrSortedBy #-}
 
+-- | For empty list of 'String's returns empty array that has no elements. Trying to index it always returns error and can cause
+-- segmentation fault in the running program or interpreter (GHCi).
 takeCs1ArrSortedBy
-  :: (Char,Char) -- ^ A pair of the first characters of the starting group delimiter (the same for all 'String's in the all 'CLSpecifications') and the probable its modification being also the first character.
+  :: FirstChars -- ^ A pair of the first characters of the starting group delimiter (the same for all 'String's in the all 'CLSpecifications') and the probable its modification being also the first character.
   -> (Arguments -> Arguments -> Ordering) -- ^ A 'compare'-like implementation for 'Arguments'. If needed you can implement your own 'Ord' instance for 'Arguments' and use it here. Here can be partial, just for 'C's.
   -> CLSpecifications
   -> [String]
   -> Array Int Arguments
-takeCs1ArrSortedBy (x1,x2) f ts xss
- | null xss = error "CLI.Arguments.takeCs1ArrSortedBy: Empty list of 'String's."
- | otherwise = listArray (0,l-1) js
-     where js = takeArgs1SortedBy (x1,x2) (\x -> notNullArguments x && isC x) f  ts xss
-           l = length js
+takeCs1ArrSortedBy (x1,x2) = takeABCsArrSortedBy (takeArgs1SortedBy (x1,x2) (\x -> notNullArguments x && isC x))
 {-# INLINABLE takeCs1ArrSortedBy #-}
 
+-- | For empty list of 'String's returns empty array that has no elements. Trying to index it always returns error and can cause
+-- segmentation fault in the running program or interpreter (GHCi).
 takeBsArrSortedBy
   :: (Arguments -> Arguments -> Ordering) -- ^ A 'compare'-like implementation for 'Arguments'. If needed you can implement your own 'Ord' instance for 'Arguments' and use it here. Here can be partial, just for 'B's.
   -> CLSpecifications
   -> [String]
   -> Array Int Arguments
-takeBsArrSortedBy f ts xss
- | null xss = error "CLI.Arguments.takeBsArrSortedBy: Empty list of 'String's."
- | otherwise = listArray (0,l-1) js
-     where js = takeArgsSortedBy (\x -> notNullArguments x && isB x) f  ts xss
-           l = length js
+takeBsArrSortedBy = takeABCsArrSortedBy (takeArgsSortedBy (\x -> notNullArguments x && isB x))
 {-# INLINABLE takeBsArrSortedBy #-}
 
+-- | For empty list of 'String's returns empty array that has no elements. Trying to index it always returns error and can cause
+-- segmentation fault in the running program or interpreter (GHCi).
 takeAsArrSortedBy
   :: (Arguments -> Arguments -> Ordering) -- ^ A 'compare'-like implementation for 'Arguments'. If needed you can implement your own 'Ord' instance for 'Arguments' and use it here. Here can be partial, just for 'A's.
   -> CLSpecifications
   -> [String]
   -> Array Int Arguments
-takeAsArrSortedBy f ts xss
- | null xss = error "CLI.Arguments.takeAsArrSortedBy: Empty list of 'String's."
- | otherwise = listArray (0,l-1) js
-     where js = takeArgsSortedBy (\x -> notNullArguments x && isA x) f  ts xss
-           l = length js
+takeAsArrSortedBy = takeABCsArrSortedBy (takeArgsSortedBy (\x -> notNullArguments x && isA x))
 {-# INLINABLE takeAsArrSortedBy #-}
-
-------------------------------------------------------
-
diff --git a/cli-arguments.cabal b/cli-arguments.cabal
--- a/cli-arguments.cabal
+++ b/cli-arguments.cabal
@@ -4,7 +4,7 @@
 -- http://haskell.org/cabal/users-guide/
 
 name:                cli-arguments
-version:             0.3.0.0
+version:             0.3.1.0
 synopsis:            A library to process command line arguments in some more convenient way.
 description:         Uses three types of the command line arguments and order of their parsing. Usually firstly the framed by some string delimiter (the different ones) are parsed, then the groups of arguments and then the rest single-field arguments. All these groups must be not nested one into the others.
 -- bug-reports:
