I was trying to convert this rust code(which my friend made long ago) into nim: https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=9c5e295e7e9de7d5e2ba0c17ec5bf0da
So made this nim code:
import strutils, sugar
type Writer[A] = (A, string)
proc to_upper(s: string): Writer[string] =
(s.toUpper Ascii(), "to_upper()")
proc to_words(s: string): Writer[seq[string]] =
(s.split(" "), "to_words()")
proc compose [A, B, C](
m1: (A) -> Writer[B],
m2: (B) -> Writer[C]
): (A) -> Writer[C] =
let res = block:
(proc (x: auto): auto =
let
p1 = m1(x)
p2 = m2 (p1[0])
sum = p1[1] + ", " + p2[1]
(p2[0], sum)
);
return res
proc process(s: string): Writer[seq[string]] =
compose(to_upper, to_words) (s)
block Main:
let
s = "Hello world"
res = process(s)
echo res[1]
echo res[0]
But looks like it just not working, and the problem is that the closure that im trying to make in the
procedure is causing the error, can u please help me and correct the code. Thanks in advance. nim
import strutils, sugar
type Writer[A] = (A, string)
proc to_upper(s: string): Writer[string] =
(s.toUpperAscii(), "to_upper()")
proc to_words(s: string): Writer[seq[string]] =
(s.split(" "), "to_words()")
proc compose [A, B, C](
m1: (A) -> Writer[B],
m2: (B) -> Writer[C]
): (A) -> Writer[C] =
return proc (x: A): Writer[C] =
let
p1 = m1(x)
p2 = m2 (p1[0])
sum = p1[1] & ", " & p2[1]
return (p2[0], sum)
proc process(s: string): Writer[seq[string]] =
compose(to_upper, to_words) (s)
block Main:
let
s = "Hello world"
res = process(s)
echo res[1]
echo res[0]