encode :: String -> String
encode xs =
let s = normalize xs
in case s of
[] -> []
_ -> encode' s row col
where row = isqrt (length s)
col = length s `div` row
This gives the error "Variable not in scope: s". It seems the where
clause within let..in
can't see the variable s
defined earlier.
How can I rewrite this?
CodePudding user response:
The where
is defined at the function level, since s
is not defined at that level, it thus can not access s
. You can add extra declarations in the head of the let … in …
level:
encode :: String -> String
encode xs =
let s = normalize xs
row = isqrt (length s)
col = length s `div` row
in case s of
[] -> []
_ -> encode' s row col
Or move everything to a where
clause:
encode :: String -> String
encode xs = case s of
[] -> []
_ -> encode' s row col
where s = normalize xs
ns = length s
row = isqrt ns
col = ns `div` row