fresheyeball 2017-02-21 10:45:18
ph88^: hey dude
ph88^ 2017-02-21 10:45:21
:D
fresheyeball 2017-02-21 10:45:37
exio4: anyway, undefined is like an exploding null
ph88^ 2017-02-21 10:45:40
MarcelineVQ, how did you know that about $ even ?
exio4 2017-02-21 10:45:49
fresheyeball: minus all the null semantics
fresheyeball 2017-02-21 10:45:50
null statisifies any type signature in imperative code
fresheyeball 2017-02-21 10:46:09
undefined does the same thing in Haskell
fresheyeball 2017-02-21 10:46:24
except if you evaluate null in imperative code, all is well, we do a null check for example.
fresheyeball 2017-02-21 10:46:36
but if you attempt to evaluate undefined in any way in Haskell, its a runtime error
bollu 2017-02-21 10:46:59
> undefined:undefined:[]
dolio 2017-02-21 10:47:00
exio4: ML folks would probably not say that there is an undefined _value_.
lambdabot 2017-02-21 10:47:02
[*Exception: Prelude.undefined
ahihi 2017-02-21 10:47:02
not all imperative languages have null, and even in many that do it doesn't inhabit every type
fresheyeball 2017-02-21 10:47:20
ahihi: yes, I'm just giving an example to explain
dolio 2017-02-21 10:47:32
Although how they explain functions like that, I don't exactly know.
exio4 2017-02-21 10:47:34
dolio: I said nonsense values while refering to other PLs
MarcelineVQ 2017-02-21 10:47:37
ph88^: I'm not sure, it came up when it was being implemented I think.
exio4 2017-02-21 10:47:45
dolio: to make 'em happy :)
mroman 2017-02-21 10:47:53
well in other languages you throw NotImplementedException
exio4 2017-02-21 10:48:18
dolio: as a function which claims it ∀X. () -> X is as nonsense as ∀X.X
fresheyeball 2017-02-21 10:48:37
exio4: yes indeed
nil_ 2017-02-21 10:48:39
Does "absurd type" mean "returns a and takes arguments that cannot yield a"?
mroman 2017-02-21 10:48:46
which with checked exceptions at least tell you that you shouldn't call that function
MarcelineVQ 2017-02-21 10:48:59
ph88^: but afaik it's a consequence of the fact that despite what people want to think $ is simply not ( ) and when you desugar, $ is reeeeally not ( )
mroman 2017-02-21 10:49:03
you don't see undefined until it's too late
fresheyeball 2017-02-21 10:49:06
nil_: absurd type means that you cannot have a value/term of this type
exio4 2017-02-21 10:49:19
nil_: it's related to the Curry-Howard isomorphism
nil_ 2017-02-21 10:49:30
fresheyeball: is that not equivalent to what I wrote?
mroman 2017-02-21 10:49:34
I might be using a library right now that uses undefined somewhere
mroman 2017-02-21 10:49:51
so I have no idea whether my haskell code will crash in production because some library has an undefined SOMEWHERE
fresheyeball 2017-02-21 10:49:54
I think anything with a codomain with forall is absurd
fresheyeball 2017-02-21 10:50:06
mroman: correct
exio4 2017-02-21 10:50:09
mroman: it's the imperative equivalent of an infinite loop
nil_ 2017-02-21 10:50:17
fresheyeball: that's basically what I was trying to convey.
exio4 2017-02-21 10:50:19
mroman: not the equivalent of a null
fresheyeball 2017-02-21 10:50:23
mroman: you can use safe-haskell I think
fresheyeball 2017-02-21 10:50:45
exio4: I drew distinctions on purpose
ph88^ 2017-02-21 10:50:53
MarcelineVQ, this makes me sad :'(
exio4 2017-02-21 10:51:00
fresheyeball: is it? ∀a, a -> (∀r. r -> a) :p
MarcelineVQ 2017-02-21 10:51:09
I can't recall at the moment if $ with ApplicativeDo was an oversight, there wasn't time for it, or if people are finally getting tired of special cases for it :>
nil_ 2017-02-21 10:51:49
exio4: fresheyeball meant codomains that are like "∀a".
mroman 2017-02-21 10:51:52
sure. you can write while(1); in any other programming language .
fresheyeball 2017-02-21 10:51:58
exio4: it is on the type level
fresheyeball 2017-02-21 10:52:15
exio4: but it has notable differences in behavior from Haskell (most of the time)
exio4 2017-02-21 10:52:42
nil_: I know, I am just bored :P
Cale 2017-02-21 10:53:00
mroman: Well, in production, I would recommend using error at the very least, but loch-th is better. https://hackage.haskell.org/package/loch-th
fresheyeball 2017-02-21 10:53:16
nil_: more like codomains that are like "∀a. a"
exio4 2017-02-21 10:53:20
fresheyeball: I don't know what we are talking about?
Cale 2017-02-21 10:53:25
mroman: Then when one of the supposedly-impossible cases arises, you at least get a line number.
exio4 2017-02-21 10:53:48
it was people comparing null to undefined
exio4 2017-02-21 10:53:58
they're different beasts
exio4 2017-02-21 10:54:09
undefined is the result of turing-completeness, either way
Cale 2017-02-21 10:54:17
yeah
dmwit 2017-02-21 10:54:23
Now that stack traces are a thing, is loch-th even needed?
mroman 2017-02-21 10:54:39
exio4: why?
Cale 2017-02-21 10:54:44
dmwit: We don't always run our production code with profiling turned on.
mroman 2017-02-21 10:55:01
I can have turing completeness without undefined as well.
exio4 2017-02-21 10:55:05
mroman: how? :)
mroman 2017-02-21 10:55:21
I uhm.
mroman 2017-02-21 10:55:34
write a brainfuck interpreter in a language with a c-like type system?
bollu 2017-02-21 10:55:34
there is no way to "step through" a haskell codebase is there?
bollu 2017-02-21 10:55:52
mroman: if it is turing complete, I can always encode non-termintation
bollu 2017-02-21 10:55:55
termination*
mroman 2017-02-21 10:55:55
you don't need a forall t. t type for turing completeness.
exio4 2017-02-21 10:56:21
mroman: ⊥ means "doesn't produce a `meaningful` value
Cale 2017-02-21 10:56:22
(though it's getting to the point where it almost seems like a good idea -- I'd just love to be able to extract heap profiling data in realtime as the program is running, for the sake of monitoring
exio4 2017-02-21 10:56:23
"
dmwit 2017-02-21 10:56:24
Cale: From the documentation, "CallStacks do not interact with the RTS and do not require compilation with -prof."
Cale 2017-02-21 10:56:29
hmm
Cale 2017-02-21 10:56:48
Well, I haven't ever seen them outside of building with -prof, so I'm not sure.
ezyang 2017-02-21 10:57:09
We're talking about the GHC.Stack functionality
dmwit 2017-02-21 10:57:25
Cale: Just stick `main = error "foo"` in a file, compile and run.
mroman 2017-02-21 10:57:27
of course... you can have stuff that never terminates.
ezyang 2017-02-21 10:57:35
The major problem is you have to thread the CallStack around in the type signatures
mroman 2017-02-21 10:57:35
but it still has a bound type.
exio4 2017-02-21 10:57:46
mroman: which is what exactly undefined is?
mroman 2017-02-21 10:57:55
undefined doesn't have a bound type.
dmwit 2017-02-21 10:57:56
Cale: Prints out "`error, called at test.hs:1:8`" and some other stuff.
bollu 2017-02-21 10:58:05
:t undefined
lambdabot 2017-02-21 10:58:08
a
mroman 2017-02-21 10:58:19
but i'm probably using the wrong terminology here.
exio4 2017-02-21 10:58:28
mroman: its type is ∀t.t
exio4 2017-02-21 10:58:32
mroman: every value has a type
exio4 2017-02-21 10:58:50
mroman: if you mean "polymorphic type", then you also have values like Nothing
exio4 2017-02-21 10:58:53
:t Nothing
lambdabot 2017-02-21 10:58:55
Maybe a
exio4 2017-02-21 10:59:01
∀a. Maybe a
mroman 2017-02-21 10:59:48
yeah... that's fine
mroman 2017-02-21 10:59:57
if the type is bound during invocation.
mroman 2017-02-21 11:00:12
anyway
fresheyeball 2017-02-21 11:00:22
well if we are thinking without undefined
Cale 2017-02-21 11:00:25
dmwit: ah, you're right, hm! I suppose it must have been a while since I've actually hit an error of that sort in backend code :)
fresheyeball 2017-02-21 11:00:31
∀a. Maybe a must be Nothing
bollu 2017-02-21 11:00:36
Cale: denotational semantics question: what is the use of the Scott topology?
dmwit 2017-02-21 11:00:39
Cale: grats =)
mroman 2017-02-21 11:00:40
just saying that you don't need forall t. t types to build a turing-complete language.
exio4 2017-02-21 11:01:23
mroman: I don't understand what you mean by that phrase :)
kadoban 2017-02-21 11:01:34
Well, you don't need types to have a turing-complete language, so I'm not sure how to respond to that really.
exio4 2017-02-21 11:01:37
mroman: "you don't need ∀t.t to build a turing complete language" ?
exio4 2017-02-21 11:01:48
Brainfuck is turing complete and doesn't have types, so is untyped lambda calculus
dmwit 2017-02-21 11:02:00
exio4: You can throw `fix` as a syntactic term into STLC no problem. `fix (id : Int -> Int)` will still be an infinite loop, and doesn't require any exciting types.
dmwit 2017-02-21 11:02:29
exio4: I think you do understand the statement, and agree with it vehemently. =)
mroman 2017-02-21 11:02:29
I may have misinterpreted your statement that "undefined is a consequence of turing-completeness"
bollu 2017-02-21 11:02:46
dmwit: you can't type Y in STLC, right?
exio4 2017-02-21 11:02:53
dmwit: oh, well, that makes sense indeed
dmwit 2017-02-21 11:02:58
bollu: No, but you can *add* it.
Cale 2017-02-21 11:03:04
bollu: Well, continuity under that topology imposes a condition on functions between the sets we're using to model the elements of various types which has to hold if the functions are to be computable
dmwit 2017-02-21 11:03:06
bollu: STLC+Y is an easy system to define.
bollu 2017-02-21 11:03:35
Cale: I see, so, continuity of the function in the topology means computable? that is rad :)
exio4 2017-02-21 11:03:55
so, "you don't need polymorphic types/parametric polymorphism for being turing-complete"? :)
bollu 2017-02-21 11:04:06
Cale: I wanted a sneak peek, I was reading the Scott and Stratchey book
mroman 2017-02-21 11:04:09
you don't.
Cale 2017-02-21 11:04:11
At the very least, computable implies that the function will be continuous with respect to that topology.
bollu 2017-02-21 11:04:16
I see
mroman 2017-02-21 11:04:20
but they are convenient to have :)
exio4 2017-02-21 11:04:33
mroman: while discussing about undefined, it's about ⊥ that we were talking about, might have no been clear, though.
mroman 2017-02-21 11:05:00
i.e. in the type system I'm currently working with
joe9 2017-02-21 11:05:02
is there a boxes package that can work with Text? instead of using String. https://github.com/treeowl/boxes/pull/1 seems to be pending for quite some time. Just want to check if there is something better out there.
bollu 2017-02-21 11:05:03
Cale: also, how do CCCs come into the picture, if you know?
mroman 2017-02-21 11:05:11
def foo(): foo() doesn't have an assignable type.
Cale 2017-02-21 11:05:46
You can interpret the simply typed lambda calculus in any CCC.
mroman 2017-02-21 11:06:23
so it's impossible to construct undefined :: a
exio4 2017-02-21 11:06:47
mroman: undefined = foo () ?
Cale 2017-02-21 11:06:58
So, rather than defining functions between sets, or Scott-continuous maps between directed complete partial orders, you're defining arrows between objects in some other CCC.
exio4 2017-02-21 11:07:16
mroman: I don't get what you mean
bollu 2017-02-21 11:07:22
Cale: yes, but I remember reading something about "category of scott domains forms a CCC" (?)
dmwit 2017-02-21 11:07:27
mroman: Wait, are you saying your type-checking function must first determine if the term halts?
Cale 2017-02-21 11:07:32
bollu: yeah
mroman 2017-02-21 11:07:36
dmwit: No.
nshepperd 2017-02-21 11:07:38
mroman: you mean that foo's type can't be inferred, or it can't be given a type at all? can you just write foo :: Int?
mroman 2017-02-21 11:08:06
def foo(): foo() is like saying "foo's type is foo's type"
mroman 2017-02-21 11:08:07
which
zennist 2017-02-21 11:08:11
test
mroman 2017-02-21 11:08:16
can't be done.
bollu 2017-02-21 11:08:38
Cale: I see, thanks for the overview :)
bollu 2017-02-21 11:08:51
Cale: do you know what I can read after the denotational semantics book?
Cale 2017-02-21 11:08:54
bollu: That just means that it has a terminal object, that any pair of objects has a product A x B, and that any pair of objects has an exponential B^A
exio4 2017-02-21 11:09:07
:t let foo () = foo () in foo
lambdabot 2017-02-21 11:09:10
() -> t
exio4 2017-02-21 11:09:13
mroman: I just gave it one.
exio4 2017-02-21 11:09:22
mroman: it can be () -> Int, too
dmwit 2017-02-21 11:09:26
mroman: Okay. Why have you made this design decision?
mroman 2017-02-21 11:10:22
because it's impossible to assign it a type?
Cale 2017-02-21 11:10:27
mroman: As much as I'd be all for having more totality checking, there are cases which arise in real world settings that unrestricted recursion is just really useful.
nshepperd 2017-02-21 11:10:30
mroman: so you are forbidding recursion?
mroman 2017-02-21 11:10:37
nshepperd: no.
dmwit 2017-02-21 11:10:40
mroman: Why is that a good goal?
mroman 2017-02-21 11:10:57
"concrete" type I should say.
exio4 2017-02-21 11:11:11
mroman: it's perfectly possible to assign it one?
exio4 2017-02-21 11:11:19
:let foo () = 1 + foo () in foo
mroman 2017-02-21 11:11:21
exio4: it's in more powerful type systems.
Cale 2017-02-21 11:11:27
I don't necessarily want to have to prove to the compiler that my definition is terminating, or productive in the case of coinduction.
exio4 2017-02-21 11:11:28
:t let foo () = 1 + foo () in foo
lambdabot 2017-02-21 11:11:30
Num a => () -> a
Cale 2017-02-21 11:11:42
Sometimes it might be a good idea to eventually get that done, but there are only so many hours in the day :)
nshepperd 2017-02-21 11:11:44
mroman: i'm not sure I understand. what concrete error message will I get if I try to write 'def foo(): foo()' in your system?
mroman 2017-02-21 11:12:12
"Can't assign type to foo".
exio4 2017-02-21 11:12:32
mroman: which error would "foo () = 1 + foo()" throw?
dmwit 2017-02-21 11:12:35
Cale: I think it wouldn't be too hard to design a system that ruled out `foo = foo` without ruling out all recursion or all nonterminating terms. e.g. `foo = if x then 1 else foo` could still be typable. I don't see *why* you would want to do this (yet), but I think you *could*.
mroman 2017-02-21 11:13:03
def foo(x): if x == 0 return x else return foo(x) is assignable
sternmull 2017-02-21 11:13:13
when writing a Consumer for Pipes... how can i terminate it when the end of the input is reached? Or does "await" do that for me?
dmwit 2017-02-21 11:13:33
Cale: (e.g. the type system that asks GHC what the type of a term is, and rejects when the answer is `forall a. a`, would have the property I'm suggesting.)
t4nk315 2017-02-21 11:13:38
What is a good package for prime numbers?
mroman 2017-02-21 11:13:48
that's a constraint on the if
mroman 2017-02-21 11:13:57
both the then as well as the else clause MUST have the same type
exio4 2017-02-21 11:14:26
mroman: so you are restricting polymorphism?
mroman 2017-02-21 11:14:30
so if you have either a then or an else clause with an assignable type it binds the other one as well.
exio4 2017-02-21 11:14:37
mroman: you will still have non-terminating values which can inhabit every type?
dmwit 2017-02-21 11:15:01
exio4: I don't think he will. Only non-terminating values that can inhabit specific types. =)
mroman 2017-02-21 11:15:19
well
mroman 2017-02-21 11:15:34
def loop(a): if False then return a else lop(a)
mroman 2017-02-21 11:15:39
won't return.
mroman 2017-02-21 11:15:48
but it has type a -> a
exio4 2017-02-21 11:15:52
dmwit: heh, yeah, seems like a loss of generality which doesn't tackles the real "issue" though
dmwit 2017-02-21 11:16:08
Yes. I am awaiting an answer to my "why" question. =)
Cale 2017-02-21 11:16:09
dmwit: Perhaps we could at least have a warning about that. :)
dmwit 2017-02-21 11:16:17
Cale: Yeah!
exio4 2017-02-21 11:16:22
Cale: that sounds cool, actually!
dmwit 2017-02-21 11:16:33
Cale: We have a runtime warning. ;-)
dmwit 2017-02-21 11:16:39
* Exception: <>
Cale 2017-02-21 11:17:07
<> is a bit more general -- you might not be able to do enough static analysis to figure all of those out at compile time
Cale 2017-02-21 11:17:54
But yeah, when something ends up with type forall a. a without literally being a call to error or undefined, it's fishy and it might be nice to have a warning about it.
dmwit 2017-02-21 11:18:03
mroman: So I think one downside of ruling out `forall a. a` as a type is that you lose the ability to define a library function that plays the role that `error` does in Haskell.
exio4 2017-02-21 11:18:24
mroman: do you have exceptions?
exio4 2017-02-21 11:18:40
mroman: if so, what's the type of your "throw" function?
mroman 2017-02-21 11:19:17
nope. no exceptions.
mroman 2017-02-21 11:19:26
more like a maybemonad
mroman 2017-02-21 11:21:36
although you could get that by circumventing the type system
mroman 2017-02-21 11:21:41
well
mroman 2017-02-21 11:21:45
"circumventing"
dmwit 2017-02-21 11:22:23
t4nk315: arithmoi?
mroman 2017-02-21 11:22:44
I mean you can always have a builtin abort that just aborts.
dmwit 2017-02-21 11:23:24
mroman: Congratulations, you just invented `undefined`. =)
mroman 2017-02-21 11:23:36
not really.
dmwit 2017-02-21 11:23:45
What's the difference?
mroman 2017-02-21 11:23:56
you can have int abort();
ezyang 2017-02-21 11:24:05
it's more like undefinedIO
dmwit 2017-02-21 11:24:18
Yes. But then you can't use `abort` in a branch of an `if` that returns a `String`.
dmwit 2017-02-21 11:24:38
If you want `abort` to be useful in that sense, it should be able to take on any type, so that you can use it to signify dead code.
max3 2017-02-21 11:25:02
dmwit, okay i've considered just passing my config around and it's too painful. if my global variable (the config) is never mutated, is it still such a terrible idea?
mroman 2017-02-21 11:25:11
of course I can.
dmwit 2017-02-21 11:25:14
max3: Then it's an even worse idea.
max3 2017-02-21 11:25:19
why?
mroman 2017-02-21 11:25:31
it's not a lazy language.
dmwit 2017-02-21 11:25:45
Because now you've introduced a subtle failure mode to your software: somebody writing to that `IORef` by accident (or on purpose!).
mroman 2017-02-21 11:25:54
const "" abort would do the trick
max3 2017-02-21 11:26:01
dmwit, okay what's the solution then
dmwit 2017-02-21 11:26:08
mroman: I mean something like `if x then "foo" else abort` would not be allowed presumably, if `abort` has type `int`.
dmwit 2017-02-21 11:26:18
max3: Reader, or pass your config around.
mroman 2017-02-21 11:26:30
no, but if x then foo else const "" abort is allowed.
max3 2017-02-21 11:26:44
Reader requires rewriting a lot potentially right?
ezyang 2017-02-21 11:27:07
yes, the trick is to define a custom monad from the beginning
dmwit 2017-02-21 11:27:20
mroman: Now your programmer has to be able to construct a value of whatever stupid type is in the other side of the branch. That seems annoying; it could be a big struct type with lots of fields to fill in.
max3 2017-02-21 11:27:40
ezyang, yes well i'm very far from the beginning
mroman 2017-02-21 11:28:57
you could also special case abort to have any type.
dmwit 2017-02-21 11:29:08
mroman: Okay, *now* you've invented `undefined`.
mroman 2017-02-21 11:29:14
that's probably what I'm going to do later anyway.
dolio 2017-02-21 11:29:33
> const "" undefined
ezyang 2017-02-21 11:29:33
max3: You and I :)
lambdabot 2017-02-21 11:29:36
""
ezyang 2017-02-21 11:29:45
sometimes there's a parameter you were threading around anyway so you start stuffing everything in that haha
dmwit 2017-02-21 11:29:47
dolio: He's stipulated earlier that his language is strict.
dmwit 2017-02-21 11:31:28
mroman: (To make my point more clear: "abort has any type" and `abort :: forall a. a` look strikingly similar to me.)
mroman 2017-02-21 11:31:29
well it's still an unassignable type.
mroman 2017-02-21 11:31:48
you can't *write* a function *in* the language to have that type.
dmwit 2017-02-21 11:32:04
Why have you chosen to prevent this?
mroman 2017-02-21 11:32:41
because it's much easier to understand.
exio4 2017-02-21 11:33:07
it's actually harder to do that
dmwit 2017-02-21 11:33:16
mroman: hm =)
exio4 2017-02-21 11:33:29
because you are making the type system more complicated than if you "simply allowed polymorphism"
mroman 2017-02-21 11:33:45
there's polymorphism.
mroman 2017-02-21 11:33:55
you can perfectly write a function a -> b -> a
mroman 2017-02-21 11:34:02
even Num a => a -> b -> a
dmwit 2017-02-21 11:34:13
mroman: Can I write `fix` in your language?
mroman 2017-02-21 11:34:18
:t fix
lambdabot 2017-02-21 11:34:20
(a -> a) -> a
mroman 2017-02-21 11:34:32
@src fix
lambdabot 2017-02-21 11:34:33
fix f = let x = f x in x
mroman 2017-02-21 11:34:38
probably not.
mroman 2017-02-21 11:35:11
although
dolio 2017-02-21 11:35:42
It's like leap years.
max3 2017-02-21 11:35:48
okay this is pretty irrelevant but what's a scripting language that strikes a good balance between easy to write and type safe-ish?
dolio 2017-02-21 11:36:18
Every 4 years, except every 100 years, except every 400 years.
frontendloader 2017-02-21 11:36:31
typescript
dmwit 2017-02-21 11:36:31
mroman: Can I write the Y combinator in your language?
mroman 2017-02-21 11:36:34
I might have to get back to you once I've actually implemented functions as values.
Rembane 2017-02-21 11:36:37
max3: Dylan
max3 2017-02-21 11:37:22
okay i should've said *with a decen eco-system* too
dolio 2017-02-21 11:37:23
Things can be polymorphic, except not when they're polymorphic like this, except certain functions which are allowed.
mroman 2017-02-21 11:38:42
well... a function has an assignable type if when there's no cycle in type checking.
kgadek 2017-02-21 11:38:44
is anybody working on language-server [LSP] for Haskell? It seems to be quite à la mode now
frontendloader 2017-02-21 11:39:07
max3: still typescript
Berra 2017-02-21 11:39:11
Does anyone here know if there existed a lazy language before KRC?
max3 2017-02-21 11:39:27
frontendloader, hmm js
mroman 2017-02-21 11:39:52
let x = f x in x is not doable though.
mroman 2017-02-21 11:40:19
that's like writing x = f(x)
kgadek 2017-02-21 11:40:28
re my question: nvm, found this https://www.reddit.com/r/haskell/comments/5r3i04/haskell_for_vscode_ide/
dmwit 2017-02-21 11:40:33
It is like writing that, yes. Why shouldn't that be doable?
dmwit 2017-02-21 11:41:24
(Before you say "because my language is strict": OCaml is strict, and you can write `x = 1 :: x` just fine there and it makes exactly the cyclic data structure you would want it to make.)
dmwit 2017-02-21 11:41:40
(`::` is OCaml's spelling of `:`)
dmwit 2017-02-21 11:42:40
> let fib' f x = if x < 2 then 1 else f (x-1) + f (x-2); fib = fib' fib in map fib [0..5]
lambdabot 2017-02-21 11:42:44
[1,1,2,3,5,8]
mroman 2017-02-21 11:42:46
you could write x = 0; x = f(x);
mroman 2017-02-21 11:42:53
something like that
mroman 2017-02-21 11:43:06
except that that's also not doable
mroman 2017-02-21 11:43:14
because variables aren't mutable
mroman 2017-02-21 11:43:26
x = 0; y = f(x); would work though.
dmwit 2017-02-21 11:43:39
But that means something very different.
mroman 2017-02-21 11:43:45
I know.
mroman 2017-02-21 11:43:57
what you want is f(f(f(f(....
dmwit 2017-02-21 11:44:07
Yes.
mroman 2017-02-21 11:44:10
nope
mroman 2017-02-21 11:44:12
can't due that.
mroman 2017-02-21 11:44:18
that's witchcraft.
mroman 2017-02-21 11:44:25
*do
dmwit 2017-02-21 11:44:29
You keep saying that. But you've never answered *why* it's good to rule that out.