• PoolloverNathan@programming.dev
      link
      fedilink
      arrow-up
      1
      ·
      9 months ago

      You can’t random-access an iterator and use it again later. Can Rust compute the value of calling a function an infinite number of times?

      — former rustacean

      • Lauchmelder@feddit.de
        link
        fedilink
        Deutsch
        arrow-up
        2
        ·
        edit-2
        9 months ago

        it can compute how often I needed to compute the value of calling a function an infinite number of times.

        println!("0");
        
        • PoolloverNathan@programming.dev
          link
          fedilink
          arrow-up
          1
          arrow-down
          1
          ·
          9 months ago

          If you’ve used a parser library’s recursive parser, you have infinite calls right there. If it supplies a recursive-parser function, that function is a type-limited equivalent to fix, which performs the infinite call operation. Your Rust library most likely implements recursion using hidden mutability, but in Haskell, your parsers can remain infinitely-recursive while still referencing themselves and immutable.

          Also, we get to ask people if they know what a monad is.

      • anton@lemmy.blahaj.zone
        link
        fedilink
        arrow-up
        1
        ·
        9 months ago

        You can’t random-access an iterator and use it again later.

        If your specific use case really needs random access to a list while lazy computing the elements just wrap them in Lazy and put them in a vector.

        Can Rust compute the value of calling a function an infinite number of times?

        The return type of an infinitely recursive function / infinite loops is ⊥, a type that by definition has no values. (Known in rust as !)

        • PoolloverNathan@programming.dev
          link
          fedilink
          arrow-up
          1
          ·
          9 months ago

          Haskell lets you infinitely recurse while still completing in finite time, and there’s even a function (fix) for that. Doing e.g. fix (+ 2) would be an infinite loop if evaluated, yes, but fix (2 :) would give you a useful value that’s an infinite stream of 2s. (it’s also useful for other things too)