i'm writing a simple test `testLaws(SemigroupKLaws...
# arrow
p
i'm writing a simple test
testLaws(SemigroupKLaws.laws(SequenceKW.semigroupK(), applicative, Eq.any()))
and it failed
Copy code
java.lang.AssertionError: Property failed for
SequenceKW(sequence=kotlin.collections.ArraysKt___ArraysKt$asSequence$$inlined$Sequence$1@5d5abcb9)
SequenceKW(sequence=kotlin.collections.ArraysKt___ArraysKt$asSequence$$inlined$Sequence$1@2973d20a)
SequenceKW(sequence=kotlin.collections.ArraysKt___ArraysKt$asSequence$$inlined$Sequence$1@1ec9a588))
	at io.kotlintest.properties.PropertyTestingKt.forAll(PropertyTesting.kt:43)
	at kategory.data.SequenceKWTest$$special$$inlined$laws$1.invoke(SemigroupKlaws.kt:17)
	at kategory.data.SequenceKWTest$$special$$inlined$laws$1.invoke(SemigroupKlaws.kt:6)
	at io.kotlintest.Spec$runTest$callable$1$1.invoke(Spec.kt:124)
	at io.kotlintest.Spec$runTest$callable$1$1.invoke(Spec.kt:15)
	at io.kotlintest.Spec$runTest$initialInterceptor$1$1.invoke(Spec.kt:116)
	at io.kotlintest.Spec$runTest$initialInterceptor$1$1.invoke(Spec.kt:15)
	at io.kotlintest.Spec.interceptTestCase(Spec.kt:78)
	at io.kotlintest.Spec$runTest$initialInterceptor$1.invoke(Spec.kt:116)
	at io.kotlintest.Spec$runTest$initialInterceptor$1.invoke(Spec.kt:15)
	at io.kotlintest.Spec$runTest$callable$1.call(Spec.kt:124)
	at java.util.concurrent.FutureTask.run(FutureTask.java:266)
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
	at java.lang.Thread.run(Thread.java:745)
any thought?
oh, maybe because Sequence is lazy? TIL:
Copy code
sequenceOf(1) == sequenceOf(1)
false

sequenceOf(1).toList() == sequenceOf(1).toList()
true
p
oh, so it was the equals override
good
p
it's
Class kategory.data.SequenceKWTest
so basically my code is fine but the problem is we can't test
Sequence
equality. (
sequenceOf(1) == sequenceOf(1)
is
false
)
e
Sequence
can't be tested for equality because the sequence might be infinite!
p
right, i took me awhile to figure that out. not intuitive to me. i mean in haskell
[1] == [1]
is
True
. (not a haskell expert, just saying)
oh, just learned that
1 #:: Stream.empty == 1 #:: Stream.empty
is also
true
in Scala. now i'm curious about kotlin decision
e
@prat I mean, how would you implement it though? You could make special cases like for emptiness, but that's it, you can't possibly describe any sequence in a way that can be compared without actually executing it
👌 1