functional programming with arrow in kotlin · functional programming with arrow in kotlin...
TRANSCRIPT
![Page 1: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/1.jpg)
![Page 2: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/2.jpg)
Functional Programming with Arrow in Kotlin@ragunathjawahar • Obvious (previously, Uncommon Bangalore)
![Page 3: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/3.jpg)
fun findFirst(array: Array<Char>, key: Char): Int { for (i in array.indices) { if (array[i] == key) return i } return -1 }
![Page 4: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/4.jpg)
fun findFirst(array: Array<Char>, key: Char): Int { for (i in array.indices) { if (array[i] == key) return i } return -1 }
![Page 5: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/5.jpg)
fun findFirst(array: Array<Char>, key: Char): Int { for (i in array.indices) { if (array[i] == key) return i } return -1 }
![Page 6: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/6.jpg)
fun findFirst(array: Array<Char>, key: Char): Int { for (i in array.indices) { if (array[i] == key) return i } return -1 }
![Page 7: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/7.jpg)
fun findFirst(array: Array<Char>, key: Char): Int { for (i in array.indices) { if (array[i] == key) return i } return -1 }
![Page 8: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/8.jpg)
fun findFirst(array: Array<Char>, key: Char): Int { for (i in array.indices) { if (array[i] == key) return i } return -1 }
![Page 9: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/9.jpg)
fun findFirst(array: Array<Char>, key: Char): Int { for (i in array.indices) { if (array[i] == key) return i } return -1 }
![Page 10: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/10.jpg)
fun findFirst(array: Array<Char>, key: Char): Int { for (i in array.indices) { if (array[i] == key) return i } return -1 }
![Page 11: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/11.jpg)
fun findFirst(array: Array<Char>, key: Char): Int { for (i in array.indices) { if (array[i] == key) return i } return -1 }
![Page 12: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/12.jpg)
fun findFirst(array: Array<Char>, key: Char): Int { for (i in array.indices) { if (array[i] == key) return i } return -1 }
![Page 13: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/13.jpg)
fun findFirst(array: Array<Char>, key: Char): Int { for (i in array.indices) { if (array[i] == key) return i } return -1 }
![Page 14: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/14.jpg)
fun findFirst(array: Array<Char>, key: Char): Int { for (i in array.indices) { if (array[i] == key) return i } return -1 }
![Page 15: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/15.jpg)
fun findFirst(array: Array<Char>, key: Char): Index { for (i in array.indices) { if (array[i] == key) return i } return -1 }
typealias Index = Int
![Page 16: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/16.jpg)
fun findFirst(array: Array<Char>, key: Char): Index { for (i in array.indices) { if (array[i] == key) return i } return -1 }
typealias Index = Int
![Page 17: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/17.jpg)
fun findFirst(array: Array<Char>, key: Char): Index { for (i in array.indices) { if (array[i] == key) return i } return -1 }
typealias Index = Int
![Page 18: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/18.jpg)
fun findFirst(array: Array<Char>, key: Char): Index { for (i in array.indices) { if (array[i] == key) return i } return -1 }
typealias Index = Int
// findFirst(chars, ‘e’) != -1
![Page 19: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/19.jpg)
fun findFirst(array: Array<Char>, key: Char): Index { for (i in array.indices) { if (array[i] == key) return i } return -1 }
typealias Index = Int
// findFirst(chars, ‘e’) != -1
![Page 20: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/20.jpg)
fun findFirst(array: Array<Char>, key: Char): Index { for (i in array.indices) { if (array[i] == key) return i } return -1 }
typealias Index = Int
![Page 21: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/21.jpg)
fun findFirst(array: Array<Char>, key: Char): Index? { for (i in array.indices) { if (array[i] == key) return i } return null }
typealias Index = Int
![Page 22: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/22.jpg)
fun findFirst(array: Array<Char>, key: Char): Option<Index> { for (i in array.indices) { if (array[i] == key) return Some(i) } return None }
typealias Index = Int
![Page 23: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/23.jpg)
fun findFirst(array: Array<Char>, key: Char): Option<Index> { for (i in array.indices) { if (array[i] == key) return Some(i) } return None }
typealias Index = Int
// absence
// presence
![Page 24: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/24.jpg)
fun findFirst(array: Array<Char>, key: Char): Option<Index> { for (i in array.indices) { if (array[i] == key) return Some(i) } return None }
typealias Index = Int
![Page 25: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/25.jpg)
fun findFirst(array: Array<Char>, key: Char): Option<Index> { for (i in array.indices) { if (array[i] == key) return Some(i) } return None }
typealias Index = Int
![Page 26: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/26.jpg)
fun findFirst(array: Array<Char>, key: Char): Option<Index> { for (i in array.indices) { if (array[i] == key) return Some(i) } return None }
typealias Index = Int
![Page 27: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/27.jpg)
fun <A> findFirst(array: Array<A>, key: A): Option<Index> { for (i in array.indices) { if (array[i] == key) return Some(i) } return None }
typealias Index = Int
![Page 28: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/28.jpg)
fun <A> findFirst(array: Array<A>, key: A): Option<Index> { for (i in array.indices) { if (array[i] == key) return Some(i) } return None }
typealias Index = Int
![Page 29: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/29.jpg)
fun <A> findFirst(array: Array<A>, key: A): Option<Index> { for (i in array.indices) { if (array[i] == key) return Some(i) } return None }
typealias Index = Int
![Page 30: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/30.jpg)
fun <A> findFirst(array: Array<A>, p: (A) -> Boolean): Option<Index> { for (i in array.indices) { if (p(array[i])) return Some(i) } return None }
typealias Index = Int
![Page 31: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/31.jpg)
fun <A> findFirst(array: Array<A>, p: (A) -> Boolean): Option<Index> { for (i in array.indices) { if (p(array[i])) return Some(i) } return None }
typealias Index = Int
// findFirst(people, { it.firstName == “Ajay” })
![Page 32: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/32.jpg)
fun <A> findFirst(array: Array<A>, p: (A) -> Boolean): Option<Index> { for (i in array.indices) { if (p(array[i])) return Some(i) } return None }
typealias Index = Int
// findFirst(people) { it.firstName == “Ajay” }
![Page 33: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/33.jpg)
fun <A> findFirst(array: Array<A>, p: (A) -> Boolean): Option<Index> { for (i in array.indices) { if (p(array[i])) return Some(i) } return None }
typealias Index = Int
![Page 34: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/34.jpg)
fun <A> findFirst(array: Array<A>, p: (A) -> Boolean): Option<Index> { for (i in array.indices) { if (p(array[i])) return Some(i) } return None }
typealias Index = Int
![Page 35: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/35.jpg)
fun <A> findFirst(array: Array<A>, p: (A) -> Boolean): Option<Index> { for (i in array.indices) { if (p(array[i])) return Some(i) } return None }
typealias Index = Int
// findFirst(people) { it.firstName == “Ajay” }
![Page 36: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/36.jpg)
fun <A> Array<A>.findFirst(p:,(A) -> Boolean): Option<Index> { for (i in this.indices) { if (p(this[i])) return Some(i) } return None }
typealias Index = Int
// people.findFirst { it.firstName == “Ajay” }
![Page 37: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/37.jpg)
fun <A> Array<A>.findFirst(p:,(A) -> Boolean): Option<Index> { for (i in this.indices) { if (p(this[i])) return Some(i) } return None }
typealias Index = Int
![Page 38: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/38.jpg)
fun <A> Array<A>.findFirst(p:,(A) -> Boolean): Option<Index> { for (i in this.indices) { if (p(this[i])) return Some(i) } return None }
fun findFirst(array: Array<Char>, key: Char): Int { for (i in array.indices) { if (array[i] == key) return i } return -1 }
![Page 39: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/39.jpg)
fun <A> findFirst(array: Array<A>, p:,(A) -> Boolean): Option<Index> { tailrec fun go(array: Array<A>, index: Index): Option<Index> { return when { index == array.size -> None p(array[index]) -> Some(index) else -> go(array, index + 1) } }
return go(array, 0) }
But!
![Page 40: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/40.jpg)
fun <A> findFirst(array: Array<A>, p:,(A) -> Boolean): Option<Index> { tailrec fun go(array: Array<A>, index: Index): Option<Index> { return when { index == array.size -> None p(array[index]) -> Some(index) else -> go(array, index + 1) } }
return go(array, 0) }
But!
![Page 41: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/41.jpg)
fun <A> findFirst(array: Array<A>, p:,(A) -> Boolean): Option<Index> { tailrec fun go(array: Array<A>, index: Index): Option<Index> { return when { index == array.size -> None p(array[index]) -> Some(index) else -> go(array, index + 1) } }
return go(array, 0) }
But!
![Page 42: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/42.jpg)
fun <A> findFirst(array: Array<A>, p:,(A) -> Boolean): Option<Index> { tailrec fun go(array: Array<A>, index: Index): Option<Index> { return when { index == array.size -> None p(array[index]) -> Some(index) else -> go(array, index + 1) } }
return go(array, 0) }
But!
![Page 43: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/43.jpg)
fun <A> findFirst(array: Array<A>, p:,(A) -> Boolean): Option<Index> { tailrec fun go(array: Array<A>, index: Index): Option<Index> { return when { index == array.size -> None p(array[index]) -> Some(index) else -> go(array, index + 1) } }
return go(array, 0) }
But!
![Page 44: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/44.jpg)
fun <A> findFirst(array: Array<A>, p:,(A) -> Boolean): Option<Index> { tailrec fun go(array: Array<A>, index: Index): Option<Index> { return when { index == array.size -> None p(array[index]) -> Some(index) else -> go(array, index + 1) } }
return go(array, 0) }
But!
![Page 45: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/45.jpg)
fun <A> findFirst(array: Array<A>, p:,(A) -> Boolean): Option<Index> { tailrec fun go(array: Array<A>, index: Index): Option<Index> { return when { index == array.size -> None p(array[index]) -> Some(index) else -> go(array, index + 1) } }
return go(array, 0) }
But!
![Page 46: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/46.jpg)
fun <A> findFirst(array: Array<A>, p:,(A) -> Boolean): Option<Index> { tailrec fun go(array: Array<A>, index: Index): Option<Index> { return when { index == array.size -> None p(array[index]) -> Some(index) else -> go(array, index + 1) } }
return go(array, 0) }
But!
![Page 47: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/47.jpg)
fun <A> findFirst(array: Array<A>, p:,(A) -> Boolean): Option<Index> { tailrec fun go(array: Array<A>, index: Index): Option<Index> { return when { index == array.size -> None p(array[index]) -> Some(index) else -> go(array, index + 1) } }
return go(array, 0) }
But!
![Page 48: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/48.jpg)
fun <A> findFirst(array: Array<A>, p:,(A) -> Boolean): Option<Index> { tailrec fun go(array: Array<A>, index: Index): Option<Index> { return when { index == array.size -> None p(array[index]) -> Some(index) else -> go(array, index + 1) } }
return go(array, 0) }
But!
![Page 49: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/49.jpg)
fun <A> findFirst(array: Array<A>, p:,(A) -> Boolean): Option<Index> { tailrec fun go(array: Array<A>, index: Index): Option<Index> { return when { index == array.size -> None p(array[index]) -> Some(index) else -> go(array, index + 1) } }
return go(array, 0) }
But!
![Page 50: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/50.jpg)
fun <A> findFirst(array: Array<A>, p:,(A) -> Boolean): Option<Index> { tailrec fun go(array: Array<A>, index: Index): Option<Index> { return when { index == array.size -> None p(array[index]) -> Some(index) else -> go(array, index + 1) } }
return go(array, 0) }
But!
![Page 51: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/51.jpg)
fun <A> findFirst(array: Array<A>, p:,(A) -> Boolean): Option<Index> { tailrec fun go(array: Array<A>, index: Index): Option<Index> { return when { index == array.size -> None p(array[index]) -> Some(index) else -> go(array, index + 1) } }
return go(array, 0) }
But!
![Page 52: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/52.jpg)
fun <A> findFirst(array: Array<A>, p:,(A) -> Boolean): Option<Index> { tailrec fun go(array: Array<A>, index: Index): Option<Index> { return when { index == array.size -> None p(array[index]) -> Some(index) else -> go(array, index + 1) } }
return go(array, 0) }
But!
![Page 53: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/53.jpg)
fun <A> findFirst(array: Array<A>, p:,(A) -> Boolean): Option<Index> { tailrec fun go(array: Array<A>, index: Index): Option<Index> { return when { index == array.size -> None p(array[index]) -> Some(index) else -> go(array, index + 1) } }
return go(array, 0) }
But!
![Page 54: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/54.jpg)
Core Ideas
![Page 55: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/55.jpg)
Core Ideas
• Purity
• Referential Transparency
• Immutability
• Lazy Evaluation
![Page 56: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/56.jpg)
Notations
![Page 57: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/57.jpg)
fun add(a: Int, b: Int): Int = a + b
val addRef: (Int, Int) -> Int = ::add
val subtractLambda = { a: Int, b: Int -> a - b }
![Page 58: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/58.jpg)
fun add(a: Int, b: Int): Int = a + b
val addRef: (Int, Int) -> Int = ::add
val subtractLambda = { a: Int, b: Int -> a - b }
![Page 59: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/59.jpg)
fun add(a: Int, b: Int): Int = a + b
val addRef: (Int, Int) -> Int = ::add
val subtractLambda = { a: Int, b: Int -> a - b }
![Page 60: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/60.jpg)
fun add(a: Int, b: Int): Int = a + b
val addRef: (Int, Int) -> Int = ::add
val subtractLambda = { a: Int, b: Int -> a - b }
![Page 61: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/61.jpg)
fun add(a: Int, b: Int): Int = a + b
val addRef: (Int, Int) -> Int = ::add
val subtractLambda = { a: Int, b: Int -> a - b }
![Page 62: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/62.jpg)
fun add(a: Int, b: Int): Int = a + b
val addRef: (Int, Int) -> Int = ::add
val subtractLambda = { a: Int, b: Int -> a - b }
![Page 63: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/63.jpg)
fun add(a: Int, b: Int): Int = a + b
val addRef: (Int, Int) -> Int = ::add
val subtractLambda = { a: Int, b: Int -> a - b }
![Page 64: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/64.jpg)
fun add(a: Int, b: Int): Int = a + b
val addRef: (Int, Int) -> Int = ::add
val subtractLambda = { a: Int, b: Int -> a - b }
![Page 65: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/65.jpg)
fun add(a: Int, b: Int): Int = a + b
val addRef: (Int, Int) -> Int = ::add
val subtractLambda = { a: Int, b: Int -> a - b }
![Page 66: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/66.jpg)
fun add(a: Int, b: Int): Int = a + b
val addRef: (Int, Int) -> Int = ::add
val subtractLambda = { a: Int, b: Int -> a - b }
![Page 67: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/67.jpg)
fun add(a: Int, b: Int): Int = a + b
val addRef: (Int, Int) -> Int = ::add
val subtractLambda = { a: Int, b: Int -> a - b }
![Page 68: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/68.jpg)
fun add(a: Int, b: Int): Int = a + b
val addRef: (Int, Int) -> Int = ::add
val subtractLambda = { a: Int, b: Int -> a - b }
![Page 69: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/69.jpg)
fun add(a: Int, b: Int): Int = a + b
val addRef: (Int, Int) -> Int = ::add
val subtractLambda = { a: Int, b: Int -> a - b }
// (a: Int, b: Int) -> Int
![Page 70: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/70.jpg)
fun add(a: Int, b: Int): Int = a + b
val addRef: (Int, Int) -> Int = ::add
val subtractLambda = { a: Int, b: Int -> a - b }
![Page 71: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/71.jpg)
fun add(a: Int, b: Int): Int = a + b
val addRef: (Int, Int) -> Int = ::add
val subtractLambda = { a: Int, b: Int -> a - b }
![Page 72: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/72.jpg)
fun add(a: Int, b: Int): Int = a + b
val addRef: (Int, Int) -> Int = ::add
val subtractLambda = { a: Int, b: Int -> a - b }
![Page 73: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/73.jpg)
fun add(a: Int, b: Int): Int = a + b
val addRef: (Int, Int) -> Int = ::add
val subtractLambda = { a: Int, b: Int -> a - b }
![Page 74: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/74.jpg)
fun add(a: Int, b: Int): Int = a + b
val addRef: (Int, Int) -> Int = ::add
val subtractLambda = { a: Int, b: Int -> a - b }
![Page 75: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/75.jpg)
fun add(a: Int, b: Int): Int = a + b
val addRef: (Int, Int) -> Int = ::add
val subtractLambda = { a: Int, b: Int -> a - b }
![Page 76: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/76.jpg)
fun add(a: Int, b: Int): Int = a + b
val addRef: (Int, Int) -> Int = ::add
val subtractLambda = { a: Int, b: Int -> a - b }
![Page 77: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/77.jpg)
val addRef: (Int, Int) -> Int = ::add
addRef.invoke(4, 5)
addRef(4, 5)
![Page 78: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/78.jpg)
Arrow Syntaxcompile "io.arrow-kt:arrow-syntax:$arrow_version"
![Page 79: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/79.jpg)
val bold: (String) -> String = { "<b>$it</b>" }
val italic: (String) -> String = { "<i>$it</i>" }
val boldItalic = bold compose italic
val italicBold = bold forwardCompose italic
Composition
![Page 80: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/80.jpg)
val bold: (String) -> String = { "<b>$it</b>" }
val italic: (String) -> String = { "<i>$it</i>" }
val boldItalic = bold compose italic
val italicBold = bold forwardCompose italic
Composition
![Page 81: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/81.jpg)
val bold: (String) -> String = { "<b>$it</b>" }
val italic: (String) -> String = { "<i>$it</i>" }
val boldItalic = bold compose italic
val italicBold = bold forwardCompose italic
Composition
// bold(“Hello”)
![Page 82: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/82.jpg)
val bold: (String) -> String = { "<b>$it</b>" }
val italic: (String) -> String = { "<i>$it</i>" }
val boldItalic = bold compose italic
val italicBold = bold forwardCompose italic
Composition
// <b>Hello</b>
![Page 83: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/83.jpg)
val bold: (String) -> String = { "<b>$it</b>" }
val italic: (String) -> String = { "<i>$it</i>" }
val boldItalic = bold compose italic
val italicBold = bold forwardCompose italic
Composition
![Page 84: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/84.jpg)
val bold: (String) -> String = { "<b>$it</b>" }
val italic: (String) -> String = { "<i>$it</i>" }
val boldItalic = bold compose italic
val italicBold = bold forwardCompose italic
Composition
// italic(“Hello”)
![Page 85: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/85.jpg)
val bold: (String) -> String = { "<b>$it</b>" }
val italic: (String) -> String = { "<i>$it</i>" }
val boldItalic = bold compose italic
val italicBold = bold forwardCompose italic
Composition
// <i>Hello</i>
![Page 86: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/86.jpg)
val bold: (String) -> String = { "<b>$it</b>" }
val italic: (String) -> String = { "<i>$it</i>" }
val boldItalic = bold compose italic
val italicBold = bold forwardCompose italic
Composition
![Page 87: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/87.jpg)
val bold: (String) -> String = { "<b>$it</b>" }
val italic: (String) -> String = { "<i>$it</i>" }
val boldItalic = bold compose italic
val italicBold = bold forwardCompose italic
Composition
// boldItalic(“Hello”)
![Page 88: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/88.jpg)
val bold: (String) -> String = { "<b>$it</b>" }
val italic: (String) -> String = { "<i>$it</i>" }
val boldItalic = bold compose italic
val italicBold = bold forwardCompose italic
Composition
// <b><i>Hello</i></b>
![Page 89: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/89.jpg)
val bold: (String) -> String = { "<b>$it</b>" }
val italic: (String) -> String = { "<i>$it</i>" }
val boldItalic = bold compose italic
val italicBold = bold forwardCompose italic
Composition
![Page 90: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/90.jpg)
val bold: (String) -> String = { "<b>$it</b>" }
val italic: (String) -> String = { "<i>$it</i>" }
val boldItalic = bold compose italic
val italicBold = bold forwardCompose italic
Composition
// italicBold(“Hello”)
![Page 91: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/91.jpg)
val bold: (String) -> String = { "<b>$it</b>" }
val italic: (String) -> String = { "<i>$it</i>" }
val boldItalic = bold compose italic
val italicBold = bold forwardCompose italic
Composition
// <i><b>Hello</b></i>
![Page 92: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/92.jpg)
val bold: (String) -> String = { "<b>$it</b>" }
val italic: (String) -> String = { "<i>$it</i>" }
val boldItalic = bold compose italic
val italicBold = bold forwardCompose italic
Composition
![Page 93: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/93.jpg)
fun multiply(a: Int, b: Int): Int = a * b
val x2: (Int) -> Int = ::multiply.partially1(2)
val x5: (Int) -> Int = ::multiply.partially1(5)
Partial Application
![Page 94: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/94.jpg)
fun multiply(a: Int, b: Int): Int = a * b
val x2: (Int) -> Int = ::multiply.partially1(2)
val x5: (Int) -> Int = ::multiply.partially1(5)
Partial Application
![Page 95: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/95.jpg)
fun multiply(a: Int, b: Int): Int = a * b
val x2: (Int) -> Int = ::multiply.partially1(2)
val x5: (Int) -> Int = ::multiply.partially1(5)
Partial Application
![Page 96: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/96.jpg)
fun multiply(a: Int, b: Int): Int = a * b
val x2: (Int) -> Int = ::multiply.partially1(2)
val x5: (Int) -> Int = ::multiply.partially1(5)
Partial Application
![Page 97: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/97.jpg)
fun multiply(a: Int, b: Int): Int = a * b
val x2: (Int) -> Int = ::multiply.partially1(2)
val x5: (Int) -> Int = ::multiply.partially1(5)
Partial Application
![Page 98: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/98.jpg)
fun multiply(a: Int, b: Int): Int = a * b
val x2: (Int) -> Int = ::multiply.partially1(2)
val x5: (Int) -> Int = ::multiply.partially1(5)
Partial Application
![Page 99: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/99.jpg)
fun multiply(a: Int, b: Int): Int = a * b
val x2: (Int) -> Int = ::multiply.partially1(2)
val x5: (Int) -> Int = ::multiply.partially1(5)
Partial Application
![Page 100: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/100.jpg)
fun multiply(a: Int, b: Int): Int = a * b
val x2: (Int) -> Int = ::multiply.partially1(2)
val x5: (Int) -> Int = ::multiply.partially1(5)
Partial Application
![Page 101: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/101.jpg)
fun multiply(a: Int, b: Int): Int = a * b
val x2: (Int) -> Int = ::multiply.partially1(2)
val x5: (Int) -> Int = ::multiply.partially1(5)
Partial Application
// x2(10)
![Page 102: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/102.jpg)
fun multiply(a: Int, b: Int): Int = a * b
val x2: (Int) -> Int = ::multiply.partially1(2)
val x5: (Int) -> Int = ::multiply.partially1(5)
Partial Application
// 20
![Page 103: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/103.jpg)
fun multiply(a: Int, b: Int): Int = a * b
val x2: (Int) -> Int = ::multiply.partially1(2)
val x5: (Int) -> Int = ::multiply.partially1(5)
Partial Application
![Page 104: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/104.jpg)
fun multiply(a: Int, b: Int): Int = a * b
val x2: (Int) -> Int = ::multiply.partially1(2)
val x5: (Int) -> Int = ::multiply.partially1(5)
Partial Application
![Page 105: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/105.jpg)
fun multiply(a: Int, b: Int): Int = a * b
val x2: (Int) -> Int = ::multiply.partially1(2)
val x5: (Int) -> Int = ::multiply.partially1(5)
Partial Application
![Page 106: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/106.jpg)
fun multiply(a: Int, b: Int): Int = a * b
val x2: (Int) -> Int = ::multiply.partially1(2)
val x5: (Int) -> Int = ::multiply.partially1(5)
Partial Application
![Page 107: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/107.jpg)
fun multiply(a: Int, b: Int): Int = a * b
val x2: (Int) -> Int = ::multiply.partially1(2)
val x5: (Int) -> Int = ::multiply.partially1(5)
Partial Application
![Page 108: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/108.jpg)
fun multiply(a: Int, b: Int): Int = a * b
val x2: (Int) -> Int = ::multiply.partially1(2)
val x5: (Int) -> Int = ::multiply.partially1(5)
Partial Application
![Page 109: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/109.jpg)
fun multiply(a: Int, b: Int): Int = a * b
val x2: (Int) -> Int = ::multiply.partially1(2)
val x5: (Int) -> Int = ::multiply.partially1(5)
Partial Application
// x5(10)
![Page 110: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/110.jpg)
fun multiply(a: Int, b: Int): Int = a * b
val x2: (Int) -> Int = ::multiply.partially1(2)
val x5: (Int) -> Int = ::multiply.partially1(5)
Partial Application
// 50
![Page 111: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/111.jpg)
fun multiply(a: Int, b: Int): Int = a * b
val x2: (Int) -> Int = ::multiply.partially1(2)
val x5: (Int) -> Int = ::multiply.partially1(5)
Partial Application
![Page 112: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/112.jpg)
Reverse
fun findFirst( animals: List<Animal>, predicate: (Animal) -> Boolean ): Option<Animal> { /* … */ }
val findCat: (List<Animal>) -> Option<Animal> = ::findFirst.reverse().partially1 { it is Cat }
val findDog: (List<Animal>) -> Option<Animal> = ::findFirst.reverse().partially1 { it is Dog }
![Page 113: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/113.jpg)
Reverse
fun findFirst( animals: List<Animal>, predicate: (Animal) -> Boolean ): Option<Animal> { /* … */ }
val findCat: (List<Animal>) -> Option<Animal> = ::findFirst.reverse().partially1 { it is Cat }
val findDog: (List<Animal>) -> Option<Animal> = ::findFirst.reverse().partially1 { it is Dog }
![Page 114: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/114.jpg)
Reverse
fun findFirst( animals: List<Animal>, predicate: (Animal) -> Boolean ): Option<Animal> { /* … */ }
val findCat: (List<Animal>) -> Option<Animal> = ::findFirst.reverse().partially1 { it is Cat }
val findDog: (List<Animal>) -> Option<Animal> = ::findFirst.reverse().partially1 { it is Dog }
![Page 115: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/115.jpg)
Reverse
fun findFirst( animals: List<Animal>, predicate: (Animal) -> Boolean ): Option<Animal> { /* … */ }
val findCat: (List<Animal>) -> Option<Animal> = ::findFirst.reverse().partially1 { it is Cat }
val findDog: (List<Animal>) -> Option<Animal> = ::findFirst.reverse().partially1 { it is Dog }
![Page 116: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/116.jpg)
Reverse
fun findFirst( animals: List<Animal>, predicate: (Animal) -> Boolean ): Option<Animal> { /* … */ }
val findCat: (List<Animal>) -> Option<Animal> = ::findFirst.reverse().partially1 { it is Cat }
val findDog: (List<Animal>) -> Option<Animal> = ::findFirst.reverse().partially1 { it is Dog }
![Page 117: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/117.jpg)
Reverse
fun findFirst( animals: List<Animal>, predicate: (Animal) -> Boolean ): Option<Animal> { /* … */ }
val findCat: (List<Animal>) -> Option<Animal> = ::findFirst.reverse().partially1 { it is Cat }
val findDog: (List<Animal>) -> Option<Animal> = ::findFirst.reverse().partially1 { it is Dog }
![Page 118: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/118.jpg)
Reverse
fun findFirst( animals: List<Animal>, predicate: (Animal) -> Boolean ): Option<Animal> { /* … */ }
val findCat: (List<Animal>) -> Option<Animal> = ::findFirst.reverse().partially1 { it is Cat }
val findDog: (List<Animal>) -> Option<Animal> = ::findFirst.reverse().partially1 { it is Dog }
![Page 119: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/119.jpg)
Reverse
fun findFirst( animals: List<Animal>, predicate: (Animal) -> Boolean ): Option<Animal> { /* … */ }
val findCat: (List<Animal>) -> Option<Animal> = ::findFirst.reverse().partially1 { it is Cat }
val findDog: (List<Animal>) -> Option<Animal> = ::findFirst.reverse().partially1 { it is Dog }
![Page 120: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/120.jpg)
Reverse
fun findFirst( animals: List<Animal>, predicate: (Animal) -> Boolean ): Option<Animal> { /* … */ }
val findCat: (List<Animal>) -> Option<Animal> = ::findFirst.reverse().partially1 { it is Cat }
val findDog: (List<Animal>) -> Option<Animal> = ::findFirst.reverse().partially1 { it is Dog }
![Page 121: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/121.jpg)
Reverse
fun findFirst( animals: List<Animal>, predicate: (Animal) -> Boolean ): Option<Animal> { /* … */ }
val findCat: (List<Animal>) -> Option<Animal> = ::findFirst.reverse().partially1 { it is Cat }
val findDog: (List<Animal>) -> Option<Animal> = ::findFirst.reverse().partially1 { it is Dog }
![Page 122: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/122.jpg)
Reverse
fun findFirst( animals: List<Animal>, predicate: (Animal) -> Boolean ): Option<Animal> { /* … */ }
val findCat: (List<Animal>) -> Option<Animal> = ::findFirst.reverse().partially1 { it is Cat }
val findDog: (List<Animal>) -> Option<Animal> = ::findFirst.reverse().partially1 { it is Dog }
![Page 123: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/123.jpg)
Reverse
fun findFirst( animals: List<Animal>, predicate: (Animal) -> Boolean ): Option<Animal> { /* … */ }
val findCat: (List<Animal>) -> Option<Animal> = ::findFirst.reverse().partially1 { it is Cat }
val findDog: (List<Animal>) -> Option<Animal> = ::findFirst.reverse().partially1 { it is Dog }
![Page 124: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/124.jpg)
Reverse
fun findFirst( animals: List<Animal>, predicate: (Animal) -> Boolean ): Option<Animal> { /* … */ }
val findCat: (List<Animal>) -> Option<Animal> = ::findFirst.reverse().partially1 { it is Cat }
val findDog: (List<Animal>) -> Option<Animal> = ::findFirst.reverse().partially1 { it is Dog }
![Page 125: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/125.jpg)
Reverse
fun findFirst( animals: List<Animal>, predicate: (Animal) -> Boolean ): Option<Animal> { /* … */ }
val findCat: (List<Animal>) -> Option<Animal> = ::findFirst.reverse().partially1 { it is Cat }
val findDog: (List<Animal>) -> Option<Animal> = ::findFirst.reverse().partially1 { it is Dog }
![Page 126: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/126.jpg)
Reverse
fun findFirst( animals: List<Animal>, predicate: (Animal) -> Boolean ): Option<Animal> { /* … */ }
val findCat: (List<Animal>) -> Option<Animal> = ::findFirst.reverse().partially1 { it is Cat }
val findDog: (List<Animal>) -> Option<Animal> = ::findFirst.reverse().partially1 { it is Dog }
![Page 127: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/127.jpg)
Reverse
fun findFirst( animals: List<Animal>, predicate: (Animal) -> Boolean ): Option<Animal> { /* … */ }
val findCat: (List<Animal>) -> Option<Animal> = ::findFirst.reverse().partially1 { it is Cat }
val findDog: (List<Animal>) -> Option<Animal> = ::findFirst.reverse().partially1 { it is Dog }
// findCat(animals)
![Page 128: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/128.jpg)
Reverse
fun findFirst( animals: List<Animal>, predicate: (Animal) -> Boolean ): Option<Animal> { /* … */ }
val findCat: (List<Animal>) -> Option<Animal> = ::findFirst.reverse().partially1 { it is Cat }
val findDog: (List<Animal>) -> Option<Animal> = ::findFirst.reverse().partially1 { it is Dog }
![Page 129: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/129.jpg)
Reverse
fun findFirst( animals: List<Animal>, predicate: (Animal) -> Boolean ): Option<Animal> { /* … */ }
val findCat: (List<Animal>) -> Option<Animal> = ::findFirst.reverse().partially1 { it is Cat }
val findDog: (List<Animal>) -> Option<Animal> = ::findFirst.reverse().partially1 { it is Dog }
![Page 130: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/130.jpg)
Reverse
fun findFirst( animals: List<Animal>, predicate: (Animal) -> Boolean ): Option<Animal> { /* … */ }
val findCat: (List<Animal>) -> Option<Animal> = ::findFirst.reverse().partially1 { it is Cat }
val findDog: (List<Animal>) -> Option<Animal> = ::findFirst.reverse().partially1 { it is Dog }
![Page 131: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/131.jpg)
Reverse
fun findFirst( animals: List<Animal>, predicate: (Animal) -> Boolean ): Option<Animal> { /* … */ }
val findCat: (List<Animal>) -> Option<Animal> = ::findFirst.reverse().partially1 { it is Cat }
val findDog: (List<Animal>) -> Option<Animal> = ::findFirst.reverse().partially1 { it is Dog }
![Page 132: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/132.jpg)
Reverse
fun findFirst( animals: List<Animal>, predicate: (Animal) -> Boolean ): Option<Animal> { /* … */ }
val findCat: (List<Animal>) -> Option<Animal> = ::findFirst.reverse().partially1 { it is Cat }
val findDog: (List<Animal>) -> Option<Animal> = ::findFirst.reverse().partially1 { it is Dog }
![Page 133: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/133.jpg)
Reverse
fun findFirst( animals: List<Animal>, predicate: (Animal) -> Boolean ): Option<Animal> { /* … */ }
val findCat: (List<Animal>) -> Option<Animal> = ::findFirst.reverse().partially1 { it is Cat }
val findDog: (List<Animal>) -> Option<Animal> = ::findFirst.reverse().partially1 { it is Dog }
![Page 134: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/134.jpg)
Reverse
fun findFirst( animals: List<Animal>, predicate: (Animal) -> Boolean ): Option<Animal> { /* … */ }
val findCat: (List<Animal>) -> Option<Animal> = ::findFirst.reverse().partially1 { it is Cat }
val findDog: (List<Animal>) -> Option<Animal> = ::findFirst.reverse().partially1 { it is Dog } // findDog(animals)
![Page 135: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/135.jpg)
Reverse
fun findFirst( animals: List<Animal>, predicate: (Animal) -> Boolean ): Option<Animal> { /* … */ }
val findCat: (List<Animal>) -> Option<Animal> = ::findFirst.reverse().partially1 { it is Cat }
val findDog: (List<Animal>) -> Option<Animal> = ::findFirst.reverse().partially1 { it is Dog }
![Page 136: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/136.jpg)
Logical Complement
val onlyCats: (Animal) -> Boolean = { it is Cat } val allCats = filter(animals, onlyCats)
val noCats = onlyCats.complement() val allExceptCats = filter(animals, noCats)
![Page 137: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/137.jpg)
Logical Complement
val onlyCats: (Animal) -> Boolean = { it is Cat } val allCats = filter(animals, onlyCats)
val noCats = onlyCats.complement() val allExceptCats = filter(animals, noCats)
![Page 138: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/138.jpg)
Logical Complement
val onlyCats: (Animal) -> Boolean = { it is Cat } val allCats = filter(animals, onlyCats)
val noCats = onlyCats.complement() val allExceptCats = filter(animals, noCats)
![Page 139: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/139.jpg)
Logical Complement
val onlyCats: (Animal) -> Boolean = { it is Cat } val allCats = filter(animals, onlyCats)
val noCats = onlyCats.complement() val allExceptCats = filter(animals, noCats)
![Page 140: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/140.jpg)
Logical Complement
val onlyCats: (Animal) -> Boolean = { it is Cat } val allCats = filter(animals, onlyCats)
val noCats = onlyCats.complement() val allExceptCats = filter(animals, noCats)
![Page 141: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/141.jpg)
Logical Complement
val onlyCats: (Animal) -> Boolean = { it is Cat } val allCats = filter(animals, onlyCats)
val noCats = onlyCats.complement() val allExceptCats = filter(animals, noCats)
![Page 142: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/142.jpg)
Logical Complement
val onlyCats: (Animal) -> Boolean = { it is Cat } val allCats = filter(animals, onlyCats)
val noCats = onlyCats.complement() val allExceptCats = filter(animals, noCats)
![Page 143: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/143.jpg)
Logical Complement
val onlyCats: (Animal) -> Boolean = { it is Cat } val allCats = filter(animals, onlyCats)
val noCats = onlyCats.complement() val allExceptCats = filter(animals, noCats)
![Page 144: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/144.jpg)
Logical Complement
val onlyCats: (Animal) -> Boolean = { it is Cat } val allCats = filter(animals, onlyCats)
val noCats = onlyCats.complement() val allExceptCats = filter(animals, noCats)
![Page 145: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/145.jpg)
Currying (1/2)
fun volume(width: Int, height: Int, length: Int): Int = width * height * length
volume(10, 10, 1)
val curriedVolume: (width: Int) -> (height: Int) -> (length: Int) -> Int = ::volume.curried()
curriedVolume(10)(10)(1)
![Page 146: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/146.jpg)
Currying (1/2)
fun volume(width: Int, height: Int, length: Int): Int = width * height * length
volume(10, 10, 1)
val curriedVolume: (width: Int) -> (height: Int) -> (length: Int) -> Int = ::volume.curried()
curriedVolume(10)(10)(1)
![Page 147: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/147.jpg)
Currying (1/2)
fun volume(width: Int, height: Int, length: Int): Int = width * height * length
volume(10, 10, 1)
val curriedVolume: (width: Int) -> (height: Int) -> (length: Int) -> Int = ::volume.curried()
curriedVolume(10)(10)(1)
![Page 148: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/148.jpg)
Currying (1/2)
fun volume(width: Int, height: Int, length: Int): Int = width * height * length
volume(10, 10, 1)
val curriedVolume: (width: Int) -> (height: Int) -> (length: Int) -> Int = ::volume.curried()
curriedVolume(10)(10)(1)
![Page 149: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/149.jpg)
Currying (1/2)
fun volume(width: Int, height: Int, length: Int): Int = width * height * length
volume(10, 10, 1)
val curriedVolume: (width: Int) -> (height: Int) -> (length: Int) -> Int = ::volume.curried()
curriedVolume(10)(10)(1)
![Page 150: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/150.jpg)
Currying (1/2)
fun volume(width: Int, height: Int, length: Int): Int = width * height * length
volume(10, 10, 1)
val curriedVolume: (width: Int) -> (height: Int) -> (length: Int) -> Int = ::volume.curried()
curriedVolume(10)(10)(1)
![Page 151: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/151.jpg)
Currying (1/2)
fun volume(width: Int, height: Int, length: Int): Int = width * height * length
volume(10, 10, 1)
val curriedVolume: (width: Int) -> (height: Int) -> (length: Int) -> Int = ::volume.curried()
curriedVolume(10)(10)(1)
![Page 152: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/152.jpg)
Currying (1/2)
fun volume(width: Int, height: Int, length: Int): Int = width * height * length
volume(10, 10, 1)
val curriedVolume: (width: Int) -> (height: Int) -> (length: Int) -> Int = ::volume.curried()
curriedVolume(10)(10)(1)
// 100
![Page 153: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/153.jpg)
Currying (1/2)
fun volume(width: Int, height: Int, length: Int): Int = width * height * length
volume(10, 10, 1)
val curriedVolume: (width: Int) -> (height: Int) -> (length: Int) -> Int = ::volume.curried()
curriedVolume(10)(10)(1)
![Page 154: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/154.jpg)
Currying (1/2)
fun volume(width: Int, height: Int, length: Int): Int = width * height * length
volume(10, 10, 1)
val curriedVolume: (width: Int) -> (height: Int) -> (length: Int) -> Int = ::volume.curried()
curriedVolume(10)(10)(1)
![Page 155: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/155.jpg)
Currying (1/2)
fun volume(width: Int, height: Int, length: Int): Int = width * height * length
volume(10, 10, 1)
val curriedVolume: (width: Int) -> (height: Int) -> (length: Int) -> Int = ::volume.curried()
curriedVolume(10)(10)(1)
![Page 156: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/156.jpg)
Currying (1/2)
fun volume(width: Int, height: Int, length: Int): Int = width * height * length
volume(10, 10, 1)
val curriedVolume: (width: Int) -> (height: Int) -> (length: Int) -> Int = ::volume.curried()
curriedVolume(10)(10)(1)
![Page 157: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/157.jpg)
Currying (1/2)
fun volume(width: Int, height: Int, length: Int): Int = width * height * length
volume(10, 10, 1)
val curriedVolume: (width: Int) -> (height: Int) -> (length: Int) -> Int = ::volume.curried()
curriedVolume(10)(10)(1)
![Page 158: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/158.jpg)
Currying (1/2)
fun volume(width: Int, height: Int, length: Int): Int = width * height * length
volume(10, 10, 1)
val curriedVolume: (width: Int) -> (height: Int) -> (length: Int) -> Int = ::volume.curried()
curriedVolume(10)(10)(1)
![Page 159: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/159.jpg)
Currying (1/2)
fun volume(width: Int, height: Int, length: Int): Int = width * height * length
volume(10, 10, 1)
val curriedVolume: (width: Int) -> (height: Int) -> (length: Int) -> Int = ::volume.curried()
curriedVolume(10)(10)(1)
![Page 160: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/160.jpg)
Currying (1/2)
fun volume(width: Int, height: Int, length: Int): Int = width * height * length
volume(10, 10, 1)
val curriedVolume: (width: Int) -> (height: Int) -> (length: Int) -> Int = ::volume.curried()
curriedVolume(10)(10)(1)
![Page 161: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/161.jpg)
Currying (1/2)
fun volume(width: Int, height: Int, length: Int): Int = width * height * length
volume(10, 10, 1)
val curriedVolume: (width: Int) -> (height: Int) -> (length: Int) -> Int = ::volume.curried()
curriedVolume(10)(10)(1) // 100
![Page 162: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/162.jpg)
Currying (1/2)
fun volume(width: Int, height: Int, length: Int): Int = width * height * length
volume(10, 10, 1)
val curriedVolume: (width: Int) -> (height: Int) -> (length: Int) -> Int = ::volume.curried()
curriedVolume(10)(10)(1)
![Page 163: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/163.jpg)
Currying (2/2)
fun volume(width: Int, height: Int, length: Int): Int = width * height * length
val area = ::volume .reverse().curried()(1) .uncurried().reverse()
area(10, 10)
![Page 164: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/164.jpg)
Currying (2/2)
fun volume(width: Int, height: Int, length: Int): Int = width * height * length
val area = ::volume .reverse().curried()(1) .uncurried().reverse()
area(10, 10)
![Page 165: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/165.jpg)
Currying (2/2)
fun volume(width: Int, height: Int, length: Int): Int = width * height * length
val area = ::volume .reverse().curried()(1) .uncurried().reverse()
area(10, 10)
![Page 166: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/166.jpg)
Currying (2/2)
fun volume(width: Int, height: Int, length: Int): Int = width * height * length
val area = ::volume .reverse().curried()(1) .uncurried().reverse()
area(10, 10)
// (width, height, length)
![Page 167: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/167.jpg)
Currying (2/2)
fun volume(width: Int, height: Int, length: Int): Int = width * height * length
val area = ::volume .reverse().curried()(1) .uncurried().reverse()
area(10, 10)
// (length, height, width)
![Page 168: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/168.jpg)
Currying (2/2)
fun volume(width: Int, height: Int, length: Int): Int = width * height * length
val area = ::volume .reverse().curried()(1) .uncurried().reverse()
area(10, 10)
// (length) -> (height) -> (width)
![Page 169: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/169.jpg)
Currying (2/2)
fun volume(width: Int, height: Int, length: Int): Int = width * height * length
val area = ::volume .reverse().curried()(1) .uncurried().reverse()
area(10, 10)
// (height) -> (width)
![Page 170: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/170.jpg)
Currying (2/2)
fun volume(width: Int, height: Int, length: Int): Int = width * height * length
val area = ::volume .reverse().curried()(1) .uncurried().reverse()
area(10, 10)
// (height, width)
![Page 171: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/171.jpg)
Currying (2/2)
fun volume(width: Int, height: Int, length: Int): Int = width * height * length
val area = ::volume .reverse().curried()(1) .uncurried().reverse()
area(10, 10)
// (width, height)
![Page 172: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/172.jpg)
Currying (2/2)
fun volume(width: Int, height: Int, length: Int): Int = width * height * length
val area = ::volume .reverse().curried()(1) .uncurried().reverse()
area(10, 10)
![Page 173: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/173.jpg)
Currying (2/2)
fun volume(width: Int, height: Int, length: Int): Int = width * height * length
val area = ::volume .reverse().curried()(1) .uncurried().reverse()
area(10, 10)
![Page 174: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/174.jpg)
Currying (2/2)
fun volume(width: Int, height: Int, length: Int): Int = width * height * length
val area = ::volume .reverse().curried()(1) .uncurried().reverse()
area(10, 10) // 100
![Page 175: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/175.jpg)
Currying (2/2)
fun volume(width: Int, height: Int, length: Int): Int = width * height * length
val area = ::volume .reverse().curried()(1) .uncurried().reverse()
area(10, 10)
![Page 176: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/176.jpg)
More…
• memoize() // FunctionN
• firstOption() // Array, Sequence, and Iterable
• flatten() - tail() - prependTo(List<T>) // List
• plus(C) // TupleN
• paired() - tripled() // FunctionN
• pipe() // FunctionN
![Page 177: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/177.jpg)
Data Typescompile “io.arrow-kt:arrow-core-data:$arrow_version”
![Page 178: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/178.jpg)
Data Types
• Option
• Either
• Try
• Validated
• Eval
![Page 179: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/179.jpg)
Option
sealed class Option<out A> { object None : Option<Nothing>() data class Some<out T>(val t: T) : Option<T>() }
Option is an Algebraic Data Type that is used to model the absence of value. In Kotlin they are encoded with sealed class hierarchies.
![Page 180: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/180.jpg)
Option
sealed class Option<out A> { object None : Option<Nothing>() data class Some<out T>(val t: T) : Option<T>() }
Option is an Algebraic Data Type that is used to model the absence of value. In Kotlin they are encoded with sealed class hierarchies.
![Page 181: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/181.jpg)
Option
sealed class Option<out A> { object None : Option<Nothing>() data class Some<out T>(val t: T) : Option<T>() }
Option is an Algebraic Data Type that is used to model the absence of value. In Kotlin they are encoded with sealed class hierarchies.
![Page 182: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/182.jpg)
Option
sealed class Option<out A> { object None : Option<Nothing>() data class Some<out T>(val t: T) : Option<T>() }
Option is an Algebraic Data Type that is used to model the absence of value. In Kotlin they are encoded with sealed class hierarchies.
![Page 183: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/183.jpg)
Option
sealed class Option<out A> { object None : Option<Nothing>() data class Some<out T>(val t: T) : Option<T>() }
Option is an Algebraic Data Type that is used to model the absence of value. In Kotlin they are encoded with sealed class hierarchies.
![Page 184: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/184.jpg)
Option (Construction)
val intOption: Option<Int> = Option(1)
val intOption: Option<Int> = None
val intOption: Option<Int> = Option.fromNullable(a) // a: Int?
val intOption: Option<Int> = 1.some()
val intOption: Option<Int> = none()
![Page 185: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/185.jpg)
Option (Construction)
val intOption: Option<Int> = Option(1)
val intOption: Option<Int> = None
val intOption: Option<Int> = Option.fromNullable(a) // a: Int?
val intOption: Option<Int> = 1.some()
val intOption: Option<Int> = none()
![Page 186: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/186.jpg)
Option (Construction)
val intOption: Option<Int> = Option(1)
val intOption: Option<Int> = None
val intOption: Option<Int> = Option.fromNullable(a) // a: Int?
val intOption: Option<Int> = 1.some()
val intOption: Option<Int> = none()
![Page 187: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/187.jpg)
Option (Construction)
val intOption: Option<Int> = Option(1)
val intOption: Option<Int> = None
val intOption: Option<Int> = Option.fromNullable(a) // a: Int?
val intOption: Option<Int> = 1.some()
val intOption: Option<Int> = none()
![Page 188: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/188.jpg)
Option (Construction)
val intOption: Option<Int> = Option(1)
val intOption: Option<Int> = None
val intOption: Option<Int> = Option.fromNullable(a) // a: Int?
val intOption: Option<Int> = 1.some()
val intOption: Option<Int> = none()
![Page 189: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/189.jpg)
Option (Construction)
val intOption: Option<Int> = Option(1)
val intOption: Option<Int> = None
val intOption: Option<Int> = Option.fromNullable(a) // a: Int?
val intOption: Option<Int> = 1.some()
val intOption: Option<Int> = none()
![Page 190: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/190.jpg)
Option (Construction)
val intOption: Option<Int> = Option(1)
val intOption: Option<Int> = None
val intOption: Option<Int> = Option.fromNullable(a) // a: Int?
val intOption: Option<Int> = 1.some()
val intOption: Option<Int> = none()
![Page 191: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/191.jpg)
Option (Extraction)
val intOption: Option<Int> = Option(1)
val nullableResult: Int? = intOption.orNull()
val result: Int = intOption.getOrElse { 0 }
![Page 192: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/192.jpg)
Option (Extraction)
val intOption: Option<Int> = Option(1)
val nullableResult: Int? = intOption.orNull()
val result: Int = intOption.getOrElse { 0 }
![Page 193: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/193.jpg)
Option (Extraction)
val intOption: Option<Int> = Option(1)
val nullableResult: Int? = intOption.orNull()
val result: Int = intOption.getOrElse { 0 }
![Page 194: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/194.jpg)
Option (Extraction)
val intOption: Option<Int> = Option(1)
val nullableResult: Int? = intOption.orNull()
val result: Int = intOption.getOrElse { 0 }
![Page 195: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/195.jpg)
Option (Extraction)
val intOption: Option<Int> = Option(1)
val nullableResult: Int? = intOption.orNull()
val result: Int = intOption.getOrElse { 0 }
![Page 196: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/196.jpg)
Option (Extraction - when)
val intOption: Option<Int> = Option(1)
when (intOption) { is None -> 0 is Some -> intOption.t } // Some(1)
![Page 197: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/197.jpg)
Option (Extraction - when)
val intOption: Option<Int> = Option(1)
when (intOption) { is None -> 0 is Some -> intOption.t } // Some(1)
![Page 198: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/198.jpg)
Option (Extraction - when)
val intOption: Option<Int> = Option(1)
when (intOption) { is None -> 0 is Some -> intOption.t } // Some(1)
![Page 199: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/199.jpg)
Option (Extraction - when)
val intOption: Option<Int> = Option(1)
when (intOption) { is None -> 0 is Some -> intOption.t } // Some(1)
![Page 200: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/200.jpg)
Option (Extraction - when)
val intOption: Option<Int> = Option(1)
when (intOption) { is None -> 0 is Some -> intOption.t } // Some(1)
![Page 201: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/201.jpg)
Option (Extraction - when)
val intOption: Option<Int> = Option(1)
when (intOption) { is None -> 0 is Some -> intOption.t } // Some(1)
![Page 202: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/202.jpg)
Option (Extraction - when)
val intOption: Option<Int> = Option(1)
when (intOption) { is None -> 0 is Some -> intOption.t } // Some(1)
![Page 203: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/203.jpg)
Option (Extraction - fold)
val intOption: Option<Int> = Option(1)
intOption.fold( { 0 }, { it + 1 } ) // Some(2)
![Page 204: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/204.jpg)
Option (Extraction - fold)
val intOption: Option<Int> = Option(1)
intOption.fold( { 0 }, { it + 1 } ) // Some(2)
![Page 205: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/205.jpg)
Option (Extraction - fold)
val intOption: Option<Int> = Option(1)
intOption.fold( { 0 }, { it + 1 } ) // Some(2)
![Page 206: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/206.jpg)
Option (Extraction - fold)
val intOption: Option<Int> = Option(1)
intOption.fold( { 0 }, { it + 1 } ) // Some(2)
![Page 207: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/207.jpg)
Option (Extraction - fold)
val intOption: Option<Int> = Option(1)
intOption.fold( { 0 }, { it + 1 } ) // Some(2)
![Page 208: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/208.jpg)
Option (Extraction - fold)
val intOption: Option<Int> = Option(1)
intOption.fold( { 0 }, { it + 1 } ) // Some(2)
![Page 209: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/209.jpg)
Option (Extraction - fold)
val intOption: Option<Int> = Option(1)
intOption.fold( { 0 }, { it + 1 } ) // Some(2)
![Page 210: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/210.jpg)
Option (map)
val intOption: Option<Int> = Option(1) intOption.map { it * 2 } // Some(2)
val intOption: Option<Int> = None intOption.map { it * 2 } // None
![Page 211: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/211.jpg)
Option (map)
val intOption: Option<Int> = Option(1) intOption.map { it * 2 } // Some(2)
val intOption: Option<Int> = None intOption.map { it * 2 } // None
![Page 212: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/212.jpg)
Option (map)
val intOption: Option<Int> = Option(1) intOption.map { it * 2 } // Some(2)
val intOption: Option<Int> = None intOption.map { it * 2 } // None
![Page 213: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/213.jpg)
Option (map)
val intOption: Option<Int> = Option(1) intOption.map { it * 2 } // Some(2)
val intOption: Option<Int> = None intOption.map { it * 2 } // None
![Page 214: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/214.jpg)
Option (map)
val intOption: Option<Int> = Option(1) intOption.map { it * 2 } // Some(2)
val intOption: Option<Int> = None intOption.map { it * 2 } // None
![Page 215: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/215.jpg)
Option (map)
val intOption: Option<Int> = Option(1) intOption.map { it * 2 } // Some(2)
val intOption: Option<Int> = None intOption.map { it * 2 } // None
![Page 216: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/216.jpg)
Option (map)
val intOption: Option<Int> = Option(1) intOption.map { it * 2 } // Some(2)
val intOption: Option<Int> = None intOption.map { it * 2 } // None
![Page 217: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/217.jpg)
Option (map)
val intOption: Option<Int> = Option(1) intOption.map { it * 2 } // Some(2)
val intOption: Option<Int> = None intOption.map { it * 2 } // None
![Page 218: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/218.jpg)
Option (flatMap)
val oneOption: Option<Int> = Option(1) val twoOption: Option<Int> = Option(2)
oneOption.flatMap { one -> twoOption.map { two -> one + two } } // Some(3)
![Page 219: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/219.jpg)
Option (flatMap)
val oneOption: Option<Int> = Option(1) val twoOption: Option<Int> = Option(2)
oneOption.flatMap { one -> twoOption.map { two -> one + two } } // Some(3)
![Page 220: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/220.jpg)
Option (flatMap)
val oneOption: Option<Int> = Option(1) val twoOption: Option<Int> = Option(2)
oneOption.flatMap { one -> twoOption.map { two -> one + two } } // Some(3)
![Page 221: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/221.jpg)
Option (flatMap)
val oneOption: Option<Int> = Option(1) val twoOption: Option<Int> = Option(2)
oneOption.flatMap { one -> twoOption.map { two -> one + two } } // Some(3)
![Page 222: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/222.jpg)
Option (flatMap)
val oneOption: Option<Int> = Option(1) val twoOption: Option<Int> = Option(2)
oneOption.flatMap { one -> twoOption.map { two -> one + two } } // Some(3)
![Page 223: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/223.jpg)
Option (flatMap)
val oneOption: Option<Int> = Option(1) val twoOption: Option<Int> = Option(2)
oneOption.flatMap { one -> twoOption.map { two -> one + two } } // Some(3)
![Page 224: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/224.jpg)
Option (flatMap)
val oneOption: Option<Int> = Option(1) val twoOption: Option<Int> = Option(2)
oneOption.flatMap { one -> twoOption.map { two -> one + two } } // Some(3)
![Page 225: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/225.jpg)
Option (flatMap)
val oneOption: Option<Int> = Option(1) val twoOption: Option<Int> = None
oneOption.flatMap { one -> twoOption.map { two -> one + two } } // None
![Page 226: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/226.jpg)
Option (flatMap)
val oneOption: Option<Int> = Option(1) val twoOption: Option<Int> = None
oneOption.flatMap { one -> twoOption.map { two -> one + two } } // None
![Page 227: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/227.jpg)
Option (flatMap)
val oneOption: Option<Int> = Option(1) val twoOption: Option<Int> = None
oneOption.flatMap { one -> twoOption.map { two -> one + two } } // None
![Page 228: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/228.jpg)
Option (Monad Binding)
val oneOption: Option<Int> = Option(1) val twoOption: Option<Int> = Option(2)
Option.monad().binding { val one = oneOption.bind() val two = twoOption.bind() one + two }.fix() // Some(3)
![Page 229: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/229.jpg)
Option (Monad Binding)
val oneOption: Option<Int> = Option(1) val twoOption: Option<Int> = Option(2)
Option.monad().binding { val one = oneOption.bind() val two = twoOption.bind() one + two }.fix() // Some(3)
![Page 230: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/230.jpg)
Option (Monad Binding)
val oneOption: Option<Int> = Option(1) val twoOption: Option<Int> = Option(2)
Option.monad().binding { val one = oneOption.bind() val two = twoOption.bind() one + two }.fix() // Some(3)
![Page 231: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/231.jpg)
Option (Monad Binding)
val oneOption: Option<Int> = Option(1) val twoOption: Option<Int> = Option(2)
Option.monad().binding { val one = oneOption.bind() val two = twoOption.bind() one + two }.fix() // Some(3)
![Page 232: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/232.jpg)
Option (Monad Binding)
val oneOption: Option<Int> = Option(1) val twoOption: Option<Int> = Option(2)
Option.monad().binding { val one = oneOption.bind() val two = twoOption.bind() one + two }.fix() // Some(3)
![Page 233: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/233.jpg)
Option (Monad Binding)
val oneOption: Option<Int> = Option(1) val twoOption: Option<Int> = Option(2)
Option.monad().binding { val one = oneOption.bind() val two = twoOption.bind() one + two }.fix() // Some(3)
![Page 234: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/234.jpg)
Option (Monad Binding)
val oneOption: Option<Int> = Option(1) val twoOption: Option<Int> = Option(2)
Option.monad().binding { val one = oneOption.bind() val two = twoOption.bind() one + two }.fix() // Some(3)
![Page 235: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/235.jpg)
Option (Monad Binding)
val oneOption: Option<Int> = Option(1) val twoOption: Option<Int> = Option(2)
Option.monad().binding { val one = oneOption.bind() val two = twoOption.bind() one + two }.fix() // Some(3)
![Page 236: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/236.jpg)
Option (Monad Binding)
val oneOption: Option<Int> = Option(1) val twoOption: Option<Int> = Option(2)
Option.monad().binding { val one = oneOption.bind() val two = twoOption.bind() one + two }.fix() // Some(3)
![Page 237: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/237.jpg)
Option (Monad Binding)
val oneOption: Option<Int> = Option(1) val twoOption: Option<Int> = None
Option.monad().binding { val one = oneOption.bind() val two = twoOption.bind() one + two }.fix() // None
![Page 238: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/238.jpg)
Option (Monad Binding)
val oneOption: Option<Int> = Option(1) val twoOption: Option<Int> = None
Option.monad().binding { val one = oneOption.bind() val two = twoOption.bind() one + two }.fix() // None
![Page 239: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/239.jpg)
Option (Monad Binding)
val oneOption: Option<Int> = Option(1) val twoOption: Option<Int> = None
Option.monad().binding { val one = oneOption.bind() val two = twoOption.bind() one + two }.fix() // None
![Page 240: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/240.jpg)
Option (Applicative Builder)
val maybeEspresso: Option<Espresso> = Option(Espresso(0.3)) val maybeMilkOption: Option<Milk> = Option(Milk(0.3)) val foamOption: Option<Foam> = Option(Foam(0.3))
Option.applicative() .map(maybeEspresso, maybeMilk, maybeFoam) { (espresso, milk, foam) -> Cappuccino(espresso, milk, foam) }.fix()
// Some(Cappuccino(espresso=Espresso(%=0.3), milk=Milk(%=0.3), // foam=Foam(%=0.3)))
![Page 241: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/241.jpg)
Option (Applicative Builder)
val maybeEspresso: Option<Espresso> = Option(Espresso(0.3)) val maybeMilkOption: Option<Milk> = Option(Milk(0.3)) val foamOption: Option<Foam> = Option(Foam(0.3))
Option.applicative() .map(maybeEspresso, maybeMilk, maybeFoam) { (espresso, milk, foam) -> Cappuccino(espresso, milk, foam) }.fix()
// Some(Cappuccino(espresso=Espresso(%=0.3), milk=Milk(%=0.3), // foam=Foam(%=0.3)))
![Page 242: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/242.jpg)
Option (Applicative Builder)
val maybeEspresso: Option<Espresso> = Option(Espresso(0.3)) val maybeMilkOption: Option<Milk> = Option(Milk(0.3)) val foamOption: Option<Foam> = Option(Foam(0.3))
Option.applicative() .map(maybeEspresso, maybeMilk, maybeFoam) { (espresso, milk, foam) -> Cappuccino(espresso, milk, foam) }.fix()
// Some(Cappuccino(espresso=Espresso(%=0.3), milk=Milk(%=0.3), // foam=Foam(%=0.3)))
![Page 243: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/243.jpg)
Option (Applicative Builder)
val maybeEspresso: Option<Espresso> = Option(Espresso(0.3)) val maybeMilkOption: Option<Milk> = Option(Milk(0.3)) val foamOption: Option<Foam> = Option(Foam(0.3))
Option.applicative() .map(maybeEspresso, maybeMilk, maybeFoam) { (espresso, milk, foam) -> Cappuccino(espresso, milk, foam) }.fix()
// Some(Cappuccino(espresso=Espresso(%=0.3), milk=Milk(%=0.3), // foam=Foam(%=0.3)))
![Page 244: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/244.jpg)
Option (Applicative Builder)
val maybeEspresso: Option<Espresso> = Option(Espresso(0.3)) val maybeMilkOption: Option<Milk> = Option(Milk(0.3)) val foamOption: Option<Foam> = Option(Foam(0.3))
Option.applicative() .map(maybeEspresso, maybeMilk, maybeFoam) { (espresso, milk, foam) -> Cappuccino(espresso, milk, foam) }.fix()
// Some(Cappuccino(espresso=Espresso(%=0.3), milk=Milk(%=0.3), // foam=Foam(%=0.3)))
![Page 245: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/245.jpg)
Option (Applicative Builder)
val maybeEspresso: Option<Espresso> = Option(Espresso(0.3)) val maybeMilkOption: Option<Milk> = Option(Milk(0.3)) val foamOption: Option<Foam> = Option(Foam(0.3))
Option.applicative() .map(maybeEspresso, maybeMilk, maybeFoam) { (espresso, milk, foam) -> Cappuccino(espresso, milk, foam) }.fix()
// Some(Cappuccino(espresso=Espresso(%=0.3), milk=Milk(%=0.3), // foam=Foam(%=0.3)))
![Page 246: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/246.jpg)
Option (Applicative Builder)
val maybeEspresso: Option<Espresso> = Option(Espresso(0.3)) val maybeMilkOption: Option<Milk> = Option(Milk(0.3)) val foamOption: Option<Foam> = Option(Foam(0.3))
Option.applicative() .map(maybeEspresso, maybeMilk, maybeFoam) { (espresso, milk, foam) -> Cappuccino(espresso, milk, foam) }.fix()
// Some(Cappuccino(espresso=Espresso(%=0.3), milk=Milk(%=0.3), // foam=Foam(%=0.3)))
![Page 247: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/247.jpg)
Option (Applicative Builder)
val maybeEspresso: Option<Espresso> = Option(Espresso(0.3)) val maybeMilkOption: Option<Milk> = Option(Milk(0.3)) val foamOption: Option<Foam> = Option(Foam(0.3))
Option.applicative() .map(maybeEspresso, maybeMilk, maybeFoam) { (espresso, milk, foam) -> Cappuccino(espresso, milk, foam) }.fix()
// Some(Cappuccino(espresso=Espresso(%=0.3), milk=Milk(%=0.3), // foam=Foam(%=0.3)))
![Page 248: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/248.jpg)
Option (Applicative Builder)
val maybeEspresso: Option<Espresso> = Option(Espresso(0.3)) val maybeMilkOption: Option<Milk> = Option(Milk(0.3)) val foamOption: Option<Foam> = Option(Foam(0.3))
Option.applicative() .map(maybeEspresso, maybeMilk, maybeFoam) { (espresso, milk, foam) -> Cappuccino(espresso, milk, foam) }.fix()
// Some(Cappuccino(espresso=Espresso(%=0.3), milk=Milk(%=0.3), // foam=Foam(%=0.3)))
![Page 249: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/249.jpg)
Option (Applicative Builder)
val maybeEspresso: Option<Espresso> = Option(Espresso(0.3)) val maybeMilkOption: Option<Milk> = Option(Milk(0.3)) val foamOption: Option<Foam> = Option(Foam(0.3))
Option.applicative() .map(maybeEspresso, maybeMilk, maybeFoam) { (espresso, milk, foam) -> Cappuccino(espresso, milk, foam) }.fix()
// Some(Cappuccino(espresso=Espresso(%=0.3), milk=Milk(%=0.3), // foam=Foam(%=0.3)))
![Page 250: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/250.jpg)
Option (Applicative Builder)
val maybeEspresso: Option<Espresso> = Option(Espresso(0.3)) val maybeMilkOption: Option<Milk> = Option(Milk(0.3)) val foamOption: Option<Foam> = Option(Foam(0.3))
Option.applicative() .map(maybeEspresso, maybeMilk, maybeFoam) { (espresso, milk, foam) -> Cappuccino(espresso, milk, foam) }.fix()
// Some(Cappuccino(espresso=Espresso(%=0.3), milk=Milk(%=0.3), // foam=Foam(%=0.3)))
![Page 251: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/251.jpg)
Option (Applicative Builder)
val maybeEspresso: Option<Espresso> = Option(Espresso(0.3)) val maybeMilkOption: Option<Milk> = Option(Milk(0.3)) val foamOption: Option<Foam> = None
Option.applicative() .map(maybeEspresso, maybeMilk, maybeFoam) { (espresso, milk, foam) -> Cappuccino(espresso, milk, foam) }.fix()
// None
![Page 252: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/252.jpg)
Option (Applicative Builder)
val maybeEspresso: Option<Espresso> = Option(Espresso(0.3)) val maybeMilkOption: Option<Milk> = Option(Milk(0.3)) val foamOption: Option<Foam> = None
Option.applicative() .map(maybeEspresso, maybeMilk, maybeFoam) { (espresso, milk, foam) -> Cappuccino(espresso, milk, foam) }.fix()
// None
![Page 253: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/253.jpg)
Option (Applicative Builder)
val maybeEspresso: Option<Espresso> = Option(Espresso(0.3)) val maybeMilkOption: Option<Milk> = Option(Milk(0.3)) val foamOption: Option<Foam> = None
Option.applicative() .map(maybeEspresso, maybeMilk, maybeFoam) { (espresso, milk, foam) -> Cappuccino(espresso, milk, foam) }.fix()
// None
![Page 254: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/254.jpg)
Either
sealed class Either<out A, out B> { data class Left<out A, out B>(val a: A) : Either<A, B>() data class Right<out A, out B>(val b: B) : Either<A, B>() }
Either is an Algebraic Data Type that is used to model a return type that may return one of two possible values.
![Page 255: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/255.jpg)
Either
sealed class Either<out A, out B> { data class Left<out A, out B>(val a: A) : Either<A, B>() data class Right<out A, out B>(val b: B) : Either<A, B>() }
Either is an Algebraic Data Type that is used to model a return type that may return one of two possible values.
![Page 256: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/256.jpg)
Either
sealed class Either<out A, out B> { data class Left<out A, out B>(val a: A) : Either<A, B>() data class Right<out A, out B>(val b: B) : Either<A, B>() }
Either is an Algebraic Data Type that is used to model a return type that may return one of two possible values.
![Page 257: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/257.jpg)
Either
sealed class Either<out A, out B> { data class Left<out A, out B>(val a: A) : Either<A, B>() data class Right<out A, out B>(val b: B) : Either<A, B>() }
Either is an Algebraic Data Type that is used to model a return type that may return one of two possible values.
![Page 258: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/258.jpg)
Either
sealed class Either<out A, out B> { data class Left<out A, out B>(val a: A) : Either<A, B>() data class Right<out A, out B>(val b: B) : Either<A, B>() }
Either is an Algebraic Data Type that is used to model a return type that may return one of two possible values.
![Page 259: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/259.jpg)
Either (Construction)
sealed class DomainError { /* ... */ }
val result: Either<DomainError, Int> = Right(1)
val result: Either<DomainError, Int> = Left(UnknownUser)
val result: Either<DomainError, Int> = 1.right()
val result: Either<DomainError, Int> = UnknownUser.left()
![Page 260: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/260.jpg)
Either (Construction)
sealed class DomainError { /* ... */ }
val result: Either<DomainError, Int> = Right(1)
val result: Either<DomainError, Int> = Left(UnknownUser)
val result: Either<DomainError, Int> = 1.right()
val result: Either<DomainError, Int> = UnknownUser.left()
![Page 261: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/261.jpg)
Either (Construction)
sealed class DomainError { /* ... */ }
val result: Either<DomainError, Int> = Right(1)
val result: Either<DomainError, Int> = Left(UnknownUser)
val result: Either<DomainError, Int> = 1.right()
val result: Either<DomainError, Int> = UnknownUser.left()
![Page 262: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/262.jpg)
Either (Construction)
sealed class DomainError { /* ... */ }
val result: Either<DomainError, Int> = Right(1)
val result: Either<DomainError, Int> = Left(UnknownUser)
val result: Either<DomainError, Int> = 1.right()
val result: Either<DomainError, Int> = UnknownUser.left()
![Page 263: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/263.jpg)
Either (Construction)
sealed class DomainError { /* ... */ }
val result: Either<DomainError, Int> = Right(1)
val result: Either<DomainError, Int> = Left(UnknownUser)
val result: Either<DomainError, Int> = 1.right()
val result: Either<DomainError, Int> = UnknownUser.left()
![Page 264: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/264.jpg)
Either (Construction)
sealed class DomainError { /* ... */ }
val result: Either<DomainError, Int> = Right(1)
val result: Either<DomainError, Int> = Left(UnknownUser)
val result: Either<DomainError, Int> = 1.right()
val result: Either<DomainError, Int> = UnknownUser.left()
![Page 265: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/265.jpg)
Either (Construction)
sealed class DomainError { /* ... */ }
val result: Either<DomainError, Int> = Right(1)
val result: Either<DomainError, Int> = Left(UnknownUser)
val result: Either<DomainError, Int> = 1.right()
val result: Either<DomainError, Int> = UnknownUser.left()
![Page 266: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/266.jpg)
Either (Extraction - when)
sealed class DomainError { /* ... */ }
val result: Either<DomainError, Int> = Right(1)
when (result) { is Left -> 0 is Right -> result.b } // Right(1)
![Page 267: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/267.jpg)
Either (Extraction - when)
sealed class DomainError { /* ... */ }
val result: Either<DomainError, Int> = Right(1)
when (result) { is Left -> 0 is Right -> result.b } // Right(1)
![Page 268: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/268.jpg)
Either (Extraction - when)
sealed class DomainError { /* ... */ }
val result: Either<DomainError, Int> = Right(1)
when (result) { is Left -> 0 is Right -> result.b } // Right(1)
![Page 269: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/269.jpg)
Either (Extraction - when)
sealed class DomainError { /* ... */ }
val result: Either<DomainError, Int> = Right(1)
when (result) { is Left -> 0 is Right -> result.b } // Right(1)
![Page 270: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/270.jpg)
Either (Extraction - when)
sealed class DomainError { /* ... */ }
val result: Either<DomainError, Int> = Right(1)
when (result) { is Left -> 0 is Right -> result.b } // Right(1) F
![Page 271: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/271.jpg)
Either (Extraction - when)
sealed class DomainError { /* ... */ }
val result: Either<DomainError, Int> = Right(1)
when (result) { is Left -> 0 is Right -> result.b } // Right(1)
![Page 272: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/272.jpg)
Either (Extraction - when)
sealed class DomainError { /* ... */ }
val result: Either<DomainError, Int> = Right(1)
when (result) { is Left -> 0 is Right -> result.b } // Right(1)
![Page 273: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/273.jpg)
Either (Extraction - fold)
sealed class DomainError { /* ... */ }
val result: Either<DomainError, Int> = Right(1)
result.fold( { 0 }, { it + 1 } ) // Right(2)
![Page 274: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/274.jpg)
Either (Extraction - fold)
sealed class DomainError { /* ... */ }
val result: Either<DomainError, Int> = Right(1)
result.fold( { 0 }, { it + 1 } ) // Right(2)
![Page 275: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/275.jpg)
Either (Extraction - fold)
sealed class DomainError { /* ... */ }
val result: Either<DomainError, Int> = Right(1)
result.fold( { 0 }, { it + 1 } ) // Right(2)
![Page 276: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/276.jpg)
Either (Extraction - fold)
sealed class DomainError { /* ... */ }
val result: Either<DomainError, Int> = Right(1)
result.fold( { 0 }, { it + 1 } ) // Right(2)
![Page 277: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/277.jpg)
Either (Extraction - fold)
sealed class DomainError { /* ... */ }
val result: Either<DomainError, Int> = Right(1)
result.fold( { 0 }, { it + 1 } ) // Right(2)
![Page 278: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/278.jpg)
Either (Extraction - fold)
sealed class DomainError { /* ... */ }
val result: Either<DomainError, Int> = Right(1)
result.fold( { 0 }, { it + 1 } ) // Right(2)
![Page 279: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/279.jpg)
Either (Extraction - fold)
sealed class DomainError { /* ... */ }
val result: Either<DomainError, Int> = Right(1)
result.fold( { 0 }, { it + 1 } ) // Right(2)
![Page 280: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/280.jpg)
Either (map)
sealed class DomainError { /* ... */ }
val result: Either<DomainError, Int> = Right(1) result.map { it * 2 } // Right(2)
val result: Either<DomainError, Int> = Left(UnknownUser) result.map { it * 2 } // Left(UnknownUser)
![Page 281: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/281.jpg)
Either (map)
sealed class DomainError { /* ... */ }
val result: Either<DomainError, Int> = Right(1) result.map { it * 2 } // Right(2)
val result: Either<DomainError, Int> = Left(UnknownUser) result.map { it * 2 } // Left(UnknownUser)
![Page 282: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/282.jpg)
Either (map)
sealed class DomainError { /* ... */ }
val result: Either<DomainError, Int> = Right(1) result.map { it * 2 } // Right(2)
val result: Either<DomainError, Int> = Left(UnknownUser) result.map { it * 2 } // Left(UnknownUser)
![Page 283: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/283.jpg)
Either (map)
sealed class DomainError { /* ... */ }
val result: Either<DomainError, Int> = Right(1) result.map { it * 2 } // Right(2)
val result: Either<DomainError, Int> = Left(UnknownUser) result.map { it * 2 } // Left(UnknownUser)
![Page 284: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/284.jpg)
Either (map)
sealed class DomainError { /* ... */ }
val result: Either<DomainError, Int> = Right(1) result.map { it * 2 } // Right(2)
val result: Either<DomainError, Int> = Left(UnknownUser) result.map { it * 2 } // Left(UnknownUser)
![Page 285: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/285.jpg)
Either (map)
sealed class DomainError { /* ... */ }
val result: Either<DomainError, Int> = Right(1) result.map { it * 2 } // Right(2)
val result: Either<DomainError, Int> = Left(UnknownUser) result.map { it * 2 } // Left(UnknownUser)
![Page 286: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/286.jpg)
Either (map)
sealed class DomainError { /* ... */ }
val result: Either<DomainError, Int> = Right(1) result.map { it * 2 } // Right(2)
val result: Either<DomainError, Int> = Left(UnknownUser) result.map { it * 2 } // Left(UnknownUser)
![Page 287: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/287.jpg)
Either (map)
sealed class DomainError { /* ... */ }
val result: Either<DomainError, Int> = Right(1) result.map { it * 2 } // Right(2)
val result: Either<DomainError, Int> = Left(UnknownUser) result.map { it * 2 } // Left(UnknownUser)
![Page 288: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/288.jpg)
Either (map)
sealed class DomainError { /* ... */ }
val result: Either<DomainError, Int> = Right(1) result.map { it * 2 } // Right(2)
val result: Either<DomainError, Int> = Left(UnknownUser) result.map { it * 2 } // Left(UnknownUser)
![Page 289: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/289.jpg)
Either (flatMap)
sealed class DomainError { /* ... */ }
val result1: Either<DomainError, Int> = Right(1) val result2: Either<DomainError, Int> = Right(2)
result1.flatMap { one -> result2.map { two -> one + two } } // Right(3)
![Page 290: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/290.jpg)
Either (flatMap)
sealed class DomainError { /* ... */ }
val result1: Either<DomainError, Int> = Right(1) val result2: Either<DomainError, Int> = Right(2)
result1.flatMap { one -> result2.map { two -> one + two } } // Right(3)
![Page 291: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/291.jpg)
Either (flatMap)
sealed class DomainError { /* ... */ }
val result1: Either<DomainError, Int> = Right(1) val result2: Either<DomainError, Int> = Right(2)
result1.flatMap { one -> result2.map { two -> one + two } } // Right(3)
![Page 292: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/292.jpg)
Either (flatMap)
sealed class DomainError { /* ... */ }
val result1: Either<DomainError, Int> = Right(1) val result2: Either<DomainError, Int> = Right(2)
result1.flatMap { one -> result2.map { two -> one + two } } // Right(3)
![Page 293: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/293.jpg)
Either (flatMap)
sealed class DomainError { /* ... */ }
val result1: Either<DomainError, Int> = Right(1) val result2: Either<DomainError, Int> = Right(2)
result1.flatMap { one -> result2.map { two -> one + two } } // Right(3)
![Page 294: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/294.jpg)
Either (flatMap)
sealed class DomainError { /* ... */ }
val result1: Either<DomainError, Int> = Right(1) val result2: Either<DomainError, Int> = Right(2)
result1.flatMap { one -> result2.map { two -> one + two } } // Right(3)
![Page 295: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/295.jpg)
Either (flatMap)
sealed class DomainError { /* ... */ }
val result1: Either<DomainError, Int> = Right(1) val result2: Either<DomainError, Int> = Right(2)
result1.flatMap { one -> result2.map { two -> one + two } } // Right(3)
![Page 296: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/296.jpg)
Either (flatMap)
sealed class DomainError { /* ... */ }
val result1: Either<DomainError, Int> = Right(1) val result2: Either<DomainError, Int> = Left(UnknownUser)
result1.flatMap { one -> result2.map { two -> one + two } } // Left(UnknownUser)
![Page 297: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/297.jpg)
Either (flatMap)
sealed class DomainError { /* ... */ }
val result1: Either<DomainError, Int> = Right(1) val result2: Either<DomainError, Int> = Left(UnknownUser)
result1.flatMap { one -> result2.map { two -> one + two } } // Left(UnknownUser)
![Page 298: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/298.jpg)
Either (flatMap)
sealed class DomainError { /* ... */ }
val result1: Either<DomainError, Int> = Right(1) val result2: Either<DomainError, Int> = Left(UnknownUser)
result1.flatMap { one -> result2.map { two -> one + two } } // Left(UnknownUser)
![Page 299: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/299.jpg)
Either (Monad Binding)
sealed class DomainError { /* ... */ }
val result1: Either<DomainError, Int> = Right(1) val result2: Either<DomainError, Int> = Right(2)
Either.monad<DomainError>.binding { val one = result1.bind() val two = result2.bind() one + two }.fix() // Right(3)
![Page 300: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/300.jpg)
Either (Monad Binding)
sealed class DomainError { /* ... */ }
val result1: Either<DomainError, Int> = Right(1) val result2: Either<DomainError, Int> = Right(2)
Either.monad<DomainError>.binding { val one = result1.bind() val two = result2.bind() one + two }.fix() // Right(3)
![Page 301: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/301.jpg)
Either (Monad Binding)
sealed class DomainError { /* ... */ }
val result1: Either<DomainError, Int> = Right(1) val result2: Either<DomainError, Int> = Right(2)
Either.monad<DomainError>.binding { val one = result1.bind() val two = result2.bind() one + two }.fix() // Right(3)
![Page 302: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/302.jpg)
Either (Monad Binding)
sealed class DomainError { /* ... */ }
val result1: Either<DomainError, Int> = Right(1) val result2: Either<DomainError, Int> = Right(2)
Either.monad<DomainError>.binding { val one = result1.bind() val two = result2.bind() one + two }.fix() // Right(3)
![Page 303: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/303.jpg)
Either (Monad Binding)
sealed class DomainError { /* ... */ }
val result1: Either<DomainError, Int> = Right(1) val result2: Either<DomainError, Int> = Right(2)
Either.monad<DomainError>.binding { val one = result1.bind() val two = result2.bind() one + two }.fix() // Right(3)
![Page 304: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/304.jpg)
Either (Monad Binding)
sealed class DomainError { /* ... */ }
val result1: Either<DomainError, Int> = Right(1) val result2: Either<DomainError, Int> = Right(2)
Either.monad<DomainError>.binding { val one = result1.bind() val two = result2.bind() one + two }.fix() // Right(3)
![Page 305: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/305.jpg)
Either (Monad Binding)
sealed class DomainError { /* ... */ }
val result1: Either<DomainError, Int> = Right(1) val result2: Either<DomainError, Int> = Right(2)
Either.monad<DomainError>.binding { val one = result1.bind() val two = result2.bind() one + two }.fix() // Right(3)
![Page 306: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/306.jpg)
Either (Monad Binding)
sealed class DomainError { /* ... */ }
val result1: Either<DomainError, Int> = Right(1) val result2: Either<DomainError, Int> = Right(2)
Either.monad<DomainError>.binding { val one = result1.bind() val two = result2.bind() one + two }.fix() // Right(3)
![Page 307: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/307.jpg)
Either (Monad Binding)
sealed class DomainError { /* ... */ }
val result1: Either<DomainError, Int> = Right(1) val result2: Either<DomainError, Int> = Right(2)
Either.monad<DomainError>.binding { val one = result1.bind() val two = result2.bind() one + two }.fix() // Right(3)
![Page 308: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/308.jpg)
Either (Monad Binding)
sealed class DomainError { /* ... */ }
val result1: Either<DomainError, Int> = Right(1) val result2: Either<DomainError, Int> = Left(UnknownUser)
Either.monad<DomainError>.binding { val one = result1.bind() val two = result2.bind() one + two }.fix() // Left(UnknownUser)
![Page 309: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/309.jpg)
Either (Monad Binding)
sealed class DomainError { /* ... */ }
val result1: Either<DomainError, Int> = Right(1) val result2: Either<DomainError, Int> = Left(UnknownUser)
Either.monad<DomainError>.binding { val one = result1.bind() val two = result2.bind() one + two }.fix() // Left(UnknownUser)
![Page 310: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/310.jpg)
Either (Monad Binding)
sealed class DomainError { /* ... */ }
val result1: Either<DomainError, Int> = Right(1) val result2: Either<DomainError, Int> = Left(UnknownUser)
Either.monad<DomainError>.binding { val one = result1.bind() val two = result2.bind() one + two }.fix() // Left(UnknownUser)
![Page 311: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/311.jpg)
Either (Applicative Builder)sealed class CoffeeMakerError { /* ... */ }
val espressoResult: Either<CoffeeMakerError, Espresso> = Right(Espresso(0.4)) val waterResult: Either<CoffeeMakerError, Water> = Right(Water(0.6))
Either.applicative<CoffeeMakerError>() .map(espressoResult, waterResult) { (espresso, water) -> Americano(espresso, water) }.fix()
// Right(Americano(espresso=Espresso(%=0.4), water=Water(%=0.6)))
![Page 312: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/312.jpg)
Either (Applicative Builder)sealed class CoffeeMakerError { /* ... */ }
val espressoResult: Either<CoffeeMakerError, Espresso> = Right(Espresso(0.4)) val waterResult: Either<CoffeeMakerError, Water> = Right(Water(0.6))
Either.applicative<CoffeeMakerError>() .map(espressoResult, waterResult) { (espresso, water) -> Americano(espresso, water) }.fix()
// Right(Americano(espresso=Espresso(%=0.4), water=Water(%=0.6)))
![Page 313: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/313.jpg)
Either (Applicative Builder)sealed class CoffeeMakerError { /* ... */ }
val espressoResult: Either<CoffeeMakerError, Espresso> = Right(Espresso(0.4)) val waterResult: Either<CoffeeMakerError, Water> = Right(Water(0.6))
Either.applicative<CoffeeMakerError>() .map(espressoResult, waterResult) { (espresso, water) -> Americano(espresso, water) }.fix()
// Right(Americano(espresso=Espresso(%=0.4), water=Water(%=0.6)))
![Page 314: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/314.jpg)
Either (Applicative Builder)sealed class CoffeeMakerError { /* ... */ }
val espressoResult: Either<CoffeeMakerError, Espresso> = Right(Espresso(0.4)) val waterResult: Either<CoffeeMakerError, Water> = Right(Water(0.6))
Either.applicative<CoffeeMakerError>() .map(espressoResult, waterResult) { (espresso, water) -> Americano(espresso, water) }.fix()
// Right(Americano(espresso=Espresso(%=0.4), water=Water(%=0.6)))
![Page 315: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/315.jpg)
Either (Applicative Builder)sealed class CoffeeMakerError { /* ... */ }
val espressoResult: Either<CoffeeMakerError, Espresso> = Right(Espresso(0.4)) val waterResult: Either<CoffeeMakerError, Water> = Right(Water(0.6))
Either.applicative<CoffeeMakerError>() .map(espressoResult, waterResult) { (espresso, water) -> Americano(espresso, water) }.fix()
// Right(Americano(espresso=Espresso(%=0.4), water=Water(%=0.6)))
![Page 316: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/316.jpg)
Either (Applicative Builder)sealed class CoffeeMakerError { /* ... */ }
val espressoResult: Either<CoffeeMakerError, Espresso> = Right(Espresso(0.4)) val waterResult: Either<CoffeeMakerError, Water> = Right(Water(0.6))
Either.applicative<CoffeeMakerError>() .map(espressoResult, waterResult) { (espresso, water) -> Americano(espresso, water) }.fix()
// Right(Americano(espresso=Espresso(%=0.4), water=Water(%=0.6)))
![Page 317: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/317.jpg)
Either (Applicative Builder)sealed class CoffeeMakerError { /* ... */ }
val espressoResult: Either<CoffeeMakerError, Espresso> = Right(Espresso(0.4)) val waterResult: Either<CoffeeMakerError, Water> = Right(Water(0.6))
Either.applicative<CoffeeMakerError>() .map(espressoResult, waterResult) { (espresso, water) -> Americano(espresso, water) }.fix()
// Right(Americano(espresso=Espresso(%=0.4), water=Water(%=0.6)))
![Page 318: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/318.jpg)
Either (Applicative Builder)sealed class CoffeeMakerError { /* ... */ }
val espressoResult: Either<CoffeeMakerError, Espresso> = Right(Espresso(0.4)) val waterResult: Either<CoffeeMakerError, Water> = Right(Water(0.6))
Either.applicative<CoffeeMakerError>() .map(espressoResult, waterResult) { (espresso, water) -> Americano(espresso, water) }.fix()
// Right(Americano(espresso=Espresso(%=0.4), water=Water(%=0.6)))
![Page 319: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/319.jpg)
Either (Applicative Builder)sealed class CoffeeMakerError { /* ... */ }
val espressoResult: Either<CoffeeMakerError, Espresso> = Right(Espresso(0.4)) val waterResult: Either<CoffeeMakerError, Water> = Right(Water(0.6))
Either.applicative<CoffeeMakerError>() .map(espressoResult, waterResult) { (espresso, water) -> Americano(espresso, water) }.fix()
// Right(Americano(espresso=Espresso(%=0.4), water=Water(%=0.6)))
![Page 320: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/320.jpg)
Either (Applicative Builder)sealed class CoffeeMakerError { /* ... */ }
val espressoResult: Either<CoffeeMakerError, Espresso> = Right(Espresso(0.4)) val waterResult: Either<CoffeeMakerError, Water> = Right(Water(0.6))
Either.applicative<CoffeeMakerError>() .map(espressoResult, waterResult) { (espresso, water) -> Americano(espresso, water) }.fix()
// Right(Americano(espresso=Espresso(%=0.4), water=Water(%=0.6)))
![Page 321: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/321.jpg)
Either (Applicative Builder)sealed class CoffeeMakerError { /* ... */ }
val espressoResult: Either<CoffeeMakerError, Espresso> = Right(Espresso(0.4)) val waterResult: Either<CoffeeMakerError, Water> = Right(Water(0.6))
Either.applicative<CoffeeMakerError>() .map(espressoResult, waterResult) { (espresso, water) -> Americano(espresso, water) }.fix()
// Right(Americano(espresso=Espresso(%=0.4), water=Water(%=0.6)))
![Page 322: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/322.jpg)
Either (Applicative Builder)sealed class CoffeeMakerError { /* ... */ }
val espressoResult: Either<CoffeeMakerError, Espresso> = Right(Espresso(0.4)) val waterResult: Either<CoffeeMakerError, Water> = Left(RefillWater)
Either.applicative<CoffeeMakerError>() .map(espressoResult, waterResult) { (espresso, water) -> Americano(espresso, water) }.fix()
// Left(RefillWater)
![Page 323: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/323.jpg)
Either (Applicative Builder)sealed class CoffeeMakerError { /* ... */ }
val espressoResult: Either<CoffeeMakerError, Espresso> = Right(Espresso(0.4)) val waterResult: Either<CoffeeMakerError, Water> = Left(RefillWater)
Either.applicative<CoffeeMakerError>() .map(espressoResult, waterResult) { (espresso, water) -> Americano(espresso, water) }.fix()
// Left(RefillWater)
![Page 324: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/324.jpg)
Either (Applicative Builder)sealed class CoffeeMakerError { /* ... */ }
val espressoResult: Either<CoffeeMakerError, Espresso> = Right(Espresso(0.4)) val waterResult: Either<CoffeeMakerError, Water> = Left(RefillWater)
Either.applicative<CoffeeMakerError>() .map(espressoResult, waterResult) { (espresso, water) -> Americano(espresso, water) }.fix()
// Left(RefillWater)
![Page 325: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/325.jpg)
More…
• Try // Success - Failure
• Validated // Valid - Invalid
• Eval // Now - Always - Later - Defer
• TupleN // Tuple2 - Tuple22
![Page 326: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/326.jpg)
Typeclassescompile “io.arrow-kt:arrow-typeclasses:$arrow_version” kapt “io.arrow-kt:arrow-meta:$arrow_version”
![Page 327: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/327.jpg)
Typeclasses
• Polymorphism in functional programming.
• Separates data from behaviour.
• Maybe governed by algebraic / category theoretic laws.
• Implemented as interfaces in Kotlin.
• One Typeclass instance per type.
![Page 328: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/328.jpg)
Typeclasses
• Show
• Eq
• Semigroup
• Functor
• Monad
• …
![Page 329: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/329.jpg)
Show
interface Show<in A> { fun A.show(): String }
The Show typeclass abstracts the ability to obtain a String representation of any object.
![Page 330: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/330.jpg)
Show
interface Show<in A> { fun A.show(): String }
The Show typeclass abstracts the ability to obtain a String representation of any object.
![Page 331: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/331.jpg)
Show
interface Show<in A> { fun A.show(): String }
The Show typeclass abstracts the ability to obtain a String representation of any object.
![Page 332: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/332.jpg)
Show
interface Show<in A> { fun A.show(): String }
The Show typeclass abstracts the ability to obtain a String representation of any object.
![Page 333: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/333.jpg)
Eq
interface Eq<in F> { fun F.eqv(b: F): Boolean fun F.neqv(b: F): Boolean = !eqv(b) }
The Eq typeclass abstracts the ability to compare two instances of any object. It can be compared to the typeclass equivalent of Java’s Object#equals.
![Page 334: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/334.jpg)
Eq
interface Eq<in F> { fun F.eqv(b: F): Boolean fun F.neqv(b: F): Boolean = !eqv(b) }
The Eq typeclass abstracts the ability to compare two instances of any object. It can be compared to the typeclass equivalent of Java’s Object#equals.
![Page 335: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/335.jpg)
Eq
interface Eq<in F> { fun F.eqv(b: F): Boolean fun F.neqv(b: F): Boolean = !eqv(b) }
The Eq typeclass abstracts the ability to compare two instances of any object. It can be compared to the typeclass equivalent of Java’s Object#equals.
![Page 336: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/336.jpg)
Eq
interface Eq<in F> { fun F.eqv(b: F): Boolean fun F.neqv(b: F): Boolean = !eqv(b) }
The Eq typeclass abstracts the ability to compare two instances of any object. It can be compared to the typeclass equivalent of Java’s Object#equals.
![Page 337: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/337.jpg)
Eq
interface Eq<in F> { fun F.eqv(b: F): Boolean fun F.neqv(b: F): Boolean = !eqv(b) }
The Eq typeclass abstracts the ability to compare two instances of any object. It can be compared to the typeclass equivalent of Java’s Object#equals.
![Page 338: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/338.jpg)
Semigroup
interface Semigroup<A> { fun A.combine(b: A): A operator fun A.plus(b: A): A = this.combine(b) }
The Semigroup for some given type A has a single operation combine which takes two values of type A, and returns a value of type A. This operation must be associative.
![Page 339: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/339.jpg)
Semigroup
interface Semigroup<A> { fun A.combine(b: A): A operator fun A.plus(b: A): A = this.combine(b) }
The Semigroup for some given type A has a single operation combine which takes two values of type A, and returns a value of type A. This operation must be associative.
![Page 340: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/340.jpg)
Semigroup
interface Semigroup<A> { fun A.combine(b: A): A operator fun A.plus(b: A): A = this.combine(b) }
The Semigroup for some given type A has a single operation combine which takes two values of type A, and returns a value of type A. This operation must be associative.
![Page 341: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/341.jpg)
Semigroup
interface Semigroup<A> { fun A.combine(b: A): A operator fun A.plus(b: A): A = this.combine(b) }
The Semigroup for some given type A has a single operation combine which takes two values of type A, and returns a value of type A. This operation must be associative.
![Page 342: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/342.jpg)
Semigroup
interface Semigroup<A> { fun A.combine(b: A): A operator fun A.plus(b: A): A = this.combine(b) }
The Semigroup for some given type A has a single operation combine which takes two values of type A, and returns a value of type A. This operation must be associative.
![Page 343: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/343.jpg)
Creating Instancesdata class Person(val firstName: String, val lastName: String) { companion object }
@extension interface PersonShow : Show<Person> { override fun Person.show(): String = "$firstName $lastName" }
val john = Person("John", "Doe") Person.show().run { john.show() } // John Doe
![Page 344: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/344.jpg)
Creating Instancesdata class Person(val firstName: String, val lastName: String) { companion object }
@extension interface PersonShow : Show<Person> { override fun Person.show(): String = "$firstName $lastName" }
val john = Person("John", "Doe") Person.show().run { john.show() } // John Doe
![Page 345: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/345.jpg)
Creating Instancesdata class Person(val firstName: String, val lastName: String) { companion object }
@extension interface PersonShow : Show<Person> { override fun Person.show(): String = "$firstName $lastName" }
val john = Person("John", "Doe") Person.show().run { john.show() } // John Doe
![Page 346: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/346.jpg)
Creating Instancesdata class Person(val firstName: String, val lastName: String) { companion object }
@extension interface PersonShow : Show<Person> { override fun Person.show(): String = "$firstName $lastName" }
val john = Person("John", "Doe") Person.show().run { john.show() } // John Doe
![Page 347: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/347.jpg)
Creating Instancesdata class Person(val firstName: String, val lastName: String) { companion object }
@extension interface PersonShow : Show<Person> { override fun Person.show(): String = "$firstName $lastName" }
val john = Person("John", "Doe") Person.show().run { john.show() } // John Doe
![Page 348: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/348.jpg)
Creating Instancesdata class Person(val firstName: String, val lastName: String) { companion object }
@extension interface PersonShow : Show<Person> { override fun Person.show(): String = "$firstName $lastName" }
val john = Person("John", "Doe") Person.show().run { john.show() } // John Doe
![Page 349: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/349.jpg)
Creating Instancesdata class Person(val firstName: String, val lastName: String) { companion object }
@extension interface PersonShow : Show<Person> { override fun Person.show(): String = "$firstName $lastName" }
val john = Person("John", "Doe") Person.show().run { john.show() } // John Doe
![Page 350: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/350.jpg)
Creating Instancesdata class Person(val firstName: String, val lastName: String) { companion object }
@extension interface PersonShow : Show<Person> { override fun Person.show(): String = "$firstName $lastName" }
val john = Person("John", "Doe") Person.show().run { john.show() } // John Doe
![Page 351: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/351.jpg)
Creating Instancesdata class Person(val firstName: String, val lastName: String) { companion object }
@extension interface PersonShow : Show<Person> { override fun Person.show(): String = "$firstName $lastName" }
val john = Person("John", "Doe") Person.show().run { john.show() } // John Doe
![Page 352: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/352.jpg)
Creating Instancesdata class Person(val firstName: String, val lastName: String) { companion object }
@extension interface PersonShow : Show<Person> { override fun Person.show(): String = "$firstName $lastName" }
val john = Person("John", "Doe") Person.show().run { john.show() } // John Doe
![Page 353: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/353.jpg)
Creating Instancesdata class Person(val firstName: String, val lastName: String) { companion object }
@extension interface PersonShow : Show<Person> { override fun Person.show(): String = "$firstName $lastName" }
val john = Person("John", "Doe") Person.show().run { john.show() } // John Doe
![Page 354: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/354.jpg)
Creating Instancesdata class Person(val firstName: String, val lastName: String) { companion object }
@extension interface PersonShow : Show<Person> { override fun Person.show(): String = "$firstName $lastName" }
val john = Person("John", "Doe") Person.show().run { john.show() } // John Doe
![Page 355: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/355.jpg)
More…
• Hash
• Order
• Traverse
• Applicative
• And many more…
![Page 356: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/356.jpg)
Opticscompile “io.arrow-kt:arrow-optics:$arrow_version” kapt “io.arrow-kt:arrow-meta:$arrow_version”
![Page 357: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/357.jpg)
Lens
@optics data class UserProfile( val name: Name, /* Not shown for brevity */ val contact: Contact ) { companion object }
@optics data class Contact( val email: String, val phone: String ) { companion object }
![Page 358: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/358.jpg)
Lens
@optics data class UserProfile( val name: Name, /* Not shown for brevity */ val contact: Contact ) { companion object }
@optics data class Contact( val email: String, val phone: String ) { companion object }
![Page 359: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/359.jpg)
Lens
@optics data class UserProfile( val name: Name, /* Not shown for brevity */ val contact: Contact ) { companion object }
@optics data class Contact( val email: String, val phone: String ) { companion object }
![Page 360: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/360.jpg)
Lens
@optics data class UserProfile( val name: Name, /* Not shown for brevity */ val contact: Contact ) { companion object }
@optics data class Contact( val email: String, val phone: String ) { companion object }
![Page 361: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/361.jpg)
Lens
@optics data class UserProfile( val name: Name, /* Not shown for brevity */ val contact: Contact ) { companion object }
@optics data class Contact( val email: String, val phone: String ) { companion object }
![Page 362: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/362.jpg)
Lens
@optics data class UserProfile( val name: Name, /* Not shown for brevity */ val contact: Contact ) { companion object }
@optics data class Contact( val email: String, val phone: String ) { companion object }
![Page 363: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/363.jpg)
Lens
@optics data class UserProfile( val name: Name, /* Not shown for brevity */ val contact: Contact ) { companion object }
@optics data class Contact( val email: String, val phone: String ) { companion object }
![Page 364: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/364.jpg)
Lens
@optics data class UserProfile( val name: Name, /* Not shown for brevity */ val contact: Contact ) { companion object }
@optics data class Contact( val email: String, val phone: String ) { companion object }
![Page 365: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/365.jpg)
Lens
@optics data class UserProfile( val name: Name, /* Not shown for brevity */ val contact: Contact ) { companion object }
@optics data class Contact( val email: String, val phone: String ) { companion object }
![Page 366: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/366.jpg)
Lens
@optics data class UserProfile( val name: Name, /* Not shown for brevity */ val contact: Contact ) { companion object }
@optics data class Contact( val email: String, val phone: String ) { companion object }
![Page 367: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/367.jpg)
Lens
@optics data class UserProfile( val name: Name, /* Not shown for brevity */ val contact: Contact ) { companion object }
@optics data class Contact( val email: String, val phone: String ) { companion object }
![Page 368: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/368.jpg)
Lens
@optics data class UserProfile( val name: Name, /* Not shown for brevity */ val contact: Contact ) { companion object }
@optics data class Contact( val email: String, val phone: String ) { companion object }
![Page 369: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/369.jpg)
Lens
@optics data class UserProfile( val name: Name, /* Not shown for brevity */ val contact: Contact ) { companion object }
@optics data class Contact( val email: String, val phone: String ) { companion object }
![Page 370: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/370.jpg)
Lens
@optics data class UserProfile( val name: Name, /* Not shown for brevity */ val contact: Contact ) { companion object }
@optics data class Contact( val email: String, val phone: String ) { companion object }
![Page 371: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/371.jpg)
Lens
@optics data class UserProfile( val name: Name, /* Not shown for brevity */ val contact: Contact ) { companion object }
@optics data class Contact( val email: String, val phone: String ) { companion object }
![Page 372: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/372.jpg)
Lens
@optics data class UserProfile( val name: Name, /* Not shown for brevity */ val contact: Contact ) { companion object }
@optics data class Contact( val email: String, val phone: String ) { companion object }
![Page 373: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/373.jpg)
Lens
@optics data class UserProfile( val name: Name, /* Not shown for brevity */ val contact: Contact ) { companion object }
@optics data class Contact( val email: String, val phone: String ) { companion object }
![Page 374: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/374.jpg)
Lens
@optics data class UserProfile( val name: Name, /* Not shown for brevity */ val contact: Contact ) { companion object }
@optics data class Contact( val email: String, val phone: String ) { companion object }
![Page 375: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/375.jpg)
Lens
@optics data class UserProfile( val name: Name, /* Not shown for brevity */ val contact: Contact ) { companion object }
@optics data class Contact( val email: String, val phone: String ) { companion object }
![Page 376: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/376.jpg)
Without Lens
val profile = UserProfile( Name("John", "Doe"), Contact("[email protected]", "6483920164") )
val updatedProfile = profile.copy( contact = profile.contact.copy( email = "[email protected]" ) )
![Page 377: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/377.jpg)
Without Lens
val profile = UserProfile( Name("John", "Doe"), Contact("[email protected]", "6483920164") )
val updatedProfile = profile.copy( contact = profile.contact.copy( email = "[email protected]" ) )
![Page 378: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/378.jpg)
Without Lens
val profile = UserProfile( Name("John", "Doe"), Contact("[email protected]", "6483920164") )
val updatedProfile = profile.copy( contact = profile.contact.copy( email = "[email protected]" ) )
![Page 379: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/379.jpg)
Without Lens
val profile = UserProfile( Name("John", "Doe"), Contact("[email protected]", "6483920164") )
val updatedProfile = profile.copy( contact = profile.contact.copy( email = "[email protected]" ) )
![Page 380: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/380.jpg)
Without Lens
val profile = UserProfile( Name("John", "Doe"), Contact("[email protected]", "6483920164") )
val updatedProfile = profile.copy( contact = profile.contact.copy( email = "[email protected]" ) )
![Page 381: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/381.jpg)
Without Lens
val profile = UserProfile( Name("John", "Doe"), Contact("[email protected]", "6483920164") )
val updatedProfile = profile.copy( contact = profile.contact.copy( email = "[email protected]" ) )
![Page 382: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/382.jpg)
With Lens
val profile = UserProfile( /* … */ )
val emailLens: Lens<UserProfile, String> = UserProfile.contact.email
val workEmail = "[email protected]" val updatedProfile = emailLens.modify(profile) { workEmail }
val email = emailLens.get(profile)
![Page 383: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/383.jpg)
With Lens
val profile = UserProfile( /* … */ )
val emailLens: Lens<UserProfile, String> = UserProfile.contact.email
val workEmail = "[email protected]" val updatedProfile = emailLens.modify(profile) { workEmail }
val email = emailLens.get(profile)
![Page 384: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/384.jpg)
With Lens
val profile = UserProfile( /* … */ )
val emailLens: Lens<UserProfile, String> = UserProfile.contact.email
val workEmail = "[email protected]" val updatedProfile = emailLens.modify(profile) { workEmail }
val email = emailLens.get(profile)
![Page 385: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/385.jpg)
With Lens
val profile = UserProfile( /* … */ )
val emailLens: Lens<UserProfile, String> = UserProfile.contact.email
val workEmail = "[email protected]" val updatedProfile = emailLens.modify(profile) { workEmail }
val email = emailLens.get(profile)
![Page 386: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/386.jpg)
With Lens
val profile = UserProfile( /* … */ )
val emailLens: Lens<UserProfile, String> = UserProfile.contact.email
val workEmail = "[email protected]" val updatedProfile = emailLens.modify(profile) { workEmail }
val email = emailLens.get(profile)
![Page 387: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/387.jpg)
With Lens
val profile = UserProfile( /* … */ )
val emailLens: Lens<UserProfile, String> = UserProfile.contact.email
val workEmail = "[email protected]" val updatedProfile = emailLens.modify(profile) { workEmail }
val email = emailLens.get(profile)
![Page 388: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/388.jpg)
With Lens
val profile = UserProfile( /* … */ )
val emailLens: Lens<UserProfile, String> = UserProfile.contact.email
val workEmail = "[email protected]" val updatedProfile = emailLens.modify(profile) { workEmail }
val email = emailLens.get(profile)
![Page 389: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/389.jpg)
With Lens
val profile = UserProfile( /* … */ )
val emailLens: Lens<UserProfile, String> = UserProfile.contact.email
val workEmail = "[email protected]" val updatedProfile = emailLens.modify(profile) { workEmail }
val email = emailLens.get(profile)
![Page 390: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/390.jpg)
With Lens
val profile = UserProfile( /* … */ )
val emailLens: Lens<UserProfile, String> = UserProfile.contact.email
val workEmail = "[email protected]" val updatedProfile = emailLens.modify(profile) { workEmail }
val email = emailLens.get(profile)
![Page 391: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/391.jpg)
With Lens
val profile = UserProfile( /* … */ )
val emailLens: Lens<UserProfile, String> = UserProfile.contact.email
val workEmail = "[email protected]" val updatedProfile = emailLens.modify(profile) { workEmail }
val email = emailLens.get(profile)
![Page 392: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/392.jpg)
With Lens
val profile = UserProfile( /* … */ )
val emailLens: Lens<UserProfile, String> = UserProfile.contact.email
val workEmail = "[email protected]" val updatedProfile = emailLens.modify(profile) { workEmail }
val email = emailLens.get(profile)
![Page 393: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/393.jpg)
With Lens
val profile = UserProfile( /* … */ )
val emailLens: Lens<UserProfile, String> = UserProfile.contact.email
val workEmail = "[email protected]" val updatedProfile = emailLens.modify(profile) { workEmail }
val email = emailLens.get(profile)
![Page 394: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/394.jpg)
With Lens
val profile = UserProfile( /* … */ )
val emailLens: Lens<UserProfile, String> = UserProfile.contact.email
val workEmail = "[email protected]" val updatedProfile = emailLens.modify(profile) { workEmail }
val email = emailLens.get(profile)
![Page 395: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/395.jpg)
With Lens
val profile = UserProfile( /* … */ )
val emailLens: Lens<UserProfile, String> = UserProfile.contact.email
val workEmail = "[email protected]" val updatedProfile = emailLens.modify(profile) { workEmail }
val email = emailLens.get(profile)
![Page 396: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/396.jpg)
With Lens
val profile = UserProfile( /* … */ )
val emailLens: Lens<UserProfile, String> = UserProfile.contact.email
val workEmail = "[email protected]" val updatedProfile = emailLens.modify(profile) { workEmail }
val email = emailLens.get(profile)
![Page 397: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/397.jpg)
With Lens
val profile = UserProfile( /* … */ )
val emailLens: Lens<UserProfile, String> = UserProfile.contact.email
val workEmail = "[email protected]" val updatedProfile = emailLens.modify(profile) { workEmail }
val email = emailLens.get(profile) // “[email protected]”
![Page 398: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/398.jpg)
With Lens
val profile = UserProfile( /* … */ )
val emailLens: Lens<UserProfile, String> = UserProfile.contact.email
val workEmail = "[email protected]" val updatedProfile = emailLens.modify(profile) { workEmail }
val email = emailLens.get(profile)
![Page 399: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/399.jpg)
Optional
@optics data class ShoppingCart( val id: String, val cartItems: ListK<CartItem> ) { companion object }
@optics data class CartItem( val product: Product, /* Not shown for brevity */ val quantity: Int ) { companion object }
![Page 400: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/400.jpg)
Optional
@optics data class ShoppingCart( val id: String, val cartItems: ListK<CartItem> ) { companion object }
@optics data class CartItem( val product: Product, /* Not shown for brevity */ val quantity: Int ) { companion object }
![Page 401: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/401.jpg)
Optional
@optics data class ShoppingCart( val id: String, val cartItems: ListK<CartItem> ) { companion object }
@optics data class CartItem( val product: Product, /* Not shown for brevity */ val quantity: Int ) { companion object }
![Page 402: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/402.jpg)
Optional
@optics data class ShoppingCart( val id: String, val cartItems: ListK<CartItem> ) { companion object }
@optics data class CartItem( val product: Product, /* Not shown for brevity */ val quantity: Int ) { companion object }
![Page 403: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/403.jpg)
Optional
@optics data class ShoppingCart( val id: String, val cartItems: ListK<CartItem> ) { companion object }
@optics data class CartItem( val product: Product, /* Not shown for brevity */ val quantity: Int ) { companion object }
![Page 404: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/404.jpg)
Optional
@optics data class ShoppingCart( val id: String, val cartItems: ListK<CartItem> ) { companion object }
@optics data class CartItem( val product: Product, /* Not shown for brevity */ val quantity: Int ) { companion object }
![Page 405: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/405.jpg)
Optional
@optics data class ShoppingCart( val id: String, val cartItems: ListK<CartItem> ) { companion object }
@optics data class CartItem( val product: Product, /* Not shown for brevity */ val quantity: Int ) { companion object }
![Page 406: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/406.jpg)
Optional (Set)
val shoppingCart = ShoppingCart("CRT19321", cartItems)
val quantityOptional: Optional<ShoppingCart, Int> = ShoppingCart .cartItems .index(ListK.index(), productIndex) .quantity
val updatedCart = quantityOptional.modify(shoppingCart) { it + 1 }
![Page 407: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/407.jpg)
Optional (Set)
val shoppingCart = ShoppingCart("CRT19321", cartItems)
val quantityOptional: Optional<ShoppingCart, Int> = ShoppingCart .cartItems .index(ListK.index(), productIndex) .quantity
val updatedCart = quantityOptional.modify(shoppingCart) { it + 1 }
![Page 408: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/408.jpg)
Optional (Set)
val shoppingCart = ShoppingCart("CRT19321", cartItems)
val quantityOptional: Optional<ShoppingCart, Int> = ShoppingCart .cartItems .index(ListK.index(), productIndex) .quantity
val updatedCart = quantityOptional.modify(shoppingCart) { it + 1 }
![Page 409: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/409.jpg)
Optional (Set)
val shoppingCart = ShoppingCart("CRT19321", cartItems)
val quantityOptional: Optional<ShoppingCart, Int> = ShoppingCart .cartItems .index(ListK.index(), productIndex) .quantity
val updatedCart = quantityOptional.modify(shoppingCart) { it + 1 }
![Page 410: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/410.jpg)
Optional (Set)
val shoppingCart = ShoppingCart("CRT19321", cartItems)
val quantityOptional: Optional<ShoppingCart, Int> = ShoppingCart .cartItems .index(ListK.index(), productIndex) .quantity
val updatedCart = quantityOptional.modify(shoppingCart) { it + 1 }
![Page 411: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/411.jpg)
Optional (Set)
val shoppingCart = ShoppingCart("CRT19321", cartItems)
val quantityOptional: Optional<ShoppingCart, Int> = ShoppingCart .cartItems .index(ListK.index(), productIndex) .quantity
val updatedCart = quantityOptional.modify(shoppingCart) { it + 1 }
![Page 412: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/412.jpg)
Optional (Set)
val shoppingCart = ShoppingCart("CRT19321", cartItems)
val quantityOptional: Optional<ShoppingCart, Int> = ShoppingCart .cartItems .index(ListK.index(), productIndex) .quantity
val updatedCart = quantityOptional.modify(shoppingCart) { it + 1 }
![Page 413: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/413.jpg)
Optional (Set)
val shoppingCart = ShoppingCart("CRT19321", cartItems)
val quantityOptional: Optional<ShoppingCart, Int> = ShoppingCart .cartItems .index(ListK.index(), productIndex) .quantity
val updatedCart = quantityOptional.modify(shoppingCart) { it + 1 }
![Page 414: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/414.jpg)
Optional (Set)
val shoppingCart = ShoppingCart("CRT19321", cartItems)
val quantityOptional: Optional<ShoppingCart, Int> = ShoppingCart .cartItems .index(ListK.index(), productIndex) .quantity
val updatedCart = quantityOptional.modify(shoppingCart) { it + 1 }
![Page 415: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/415.jpg)
Optional (Set)
val shoppingCart = ShoppingCart("CRT19321", cartItems)
val quantityOptional: Optional<ShoppingCart, Int> = ShoppingCart .cartItems .index(ListK.index(), productIndex) .quantity
val updatedCart = quantityOptional.modify(shoppingCart) { it + 1 }
![Page 416: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/416.jpg)
Optional (Set)
val shoppingCart = ShoppingCart("CRT19321", cartItems)
val quantityOptional: Optional<ShoppingCart, Int> = ShoppingCart .cartItems .index(ListK.index(), productIndex) .quantity
val updatedCart = quantityOptional.modify(shoppingCart) { it + 1 }
![Page 417: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/417.jpg)
Optional (Set)
val shoppingCart = ShoppingCart("CRT19321", cartItems)
val quantityOptional: Optional<ShoppingCart, Int> = ShoppingCart .cartItems .index(ListK.index(), productIndex) .quantity
val updatedCart = quantityOptional.modify(shoppingCart) { it + 1 }
![Page 418: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/418.jpg)
Optional (Set)
val shoppingCart = ShoppingCart("CRT19321", cartItems)
val quantityOptional: Optional<ShoppingCart, Int> = ShoppingCart .cartItems .index(ListK.index(), productIndex) .quantity
val updatedCart = quantityOptional.modify(shoppingCart) { it + 1 }
![Page 419: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/419.jpg)
Optional (Get)
val cartItemOption = ShoppingCart .cartItems .index(ListK.index(), productIndex) .getOption(shoppingCart)
val sameCartItemOption = ListK.index<CartItem>().run { ShoppingCart.cartItems[productIndex].getOption(shoppingCart) }
![Page 420: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/420.jpg)
Optional (Get)
val cartItemOption = ShoppingCart .cartItems .index(ListK.index(), productIndex) .getOption(shoppingCart)
val sameCartItemOption = ListK.index<CartItem>().run { ShoppingCart.cartItems[productIndex].getOption(shoppingCart) }
![Page 421: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/421.jpg)
Optional (Get)
val cartItemOption = ShoppingCart .cartItems .index(ListK.index(), productIndex) .getOption(shoppingCart)
val sameCartItemOption = ListK.index<CartItem>().run { ShoppingCart.cartItems[productIndex].getOption(shoppingCart) }
![Page 422: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/422.jpg)
Optional (Get)
val cartItemOption = ShoppingCart .cartItems .index(ListK.index(), productIndex) .getOption(shoppingCart)
val sameCartItemOption = ListK.index<CartItem>().run { ShoppingCart.cartItems[productIndex].getOption(shoppingCart) }
![Page 423: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/423.jpg)
Optional (Get)
val cartItemOption = ShoppingCart .cartItems .index(ListK.index(), productIndex) .getOption(shoppingCart)
val sameCartItemOption = ListK.index<CartItem>().run { ShoppingCart.cartItems[productIndex].getOption(shoppingCart) }
![Page 424: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/424.jpg)
Optional (Get)
val cartItemOption = ShoppingCart .cartItems .index(ListK.index(), productIndex) .getOption(shoppingCart)
val sameCartItemOption = ListK.index<CartItem>().run { ShoppingCart.cartItems[productIndex].getOption(shoppingCart) }
![Page 425: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/425.jpg)
Optional (Get)
val cartItemOption = ShoppingCart .cartItems .index(ListK.index(), productIndex) .getOption(shoppingCart)
val sameCartItemOption = ListK.index<CartItem>().run { ShoppingCart.cartItems[productIndex].getOption(shoppingCart) }
![Page 426: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/426.jpg)
Optional (Get)
val cartItemOption = ShoppingCart .cartItems .index(ListK.index(), productIndex) .getOption(shoppingCart)
val sameCartItemOption = ListK.index<CartItem>().run { ShoppingCart.cartItems[productIndex].getOption(shoppingCart) }
![Page 427: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/427.jpg)
Optional (Get)
val cartItemOption = ShoppingCart .cartItems .index(ListK.index(), productIndex) .getOption(shoppingCart)
val sameCartItemOption = ListK.index<CartItem>().run { ShoppingCart.cartItems[productIndex].getOption(shoppingCart) }
![Page 428: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/428.jpg)
Optional (Get)
val cartItemOption = ShoppingCart .cartItems .index(ListK.index(), productIndex) .getOption(shoppingCart)
val sameCartItemOption = ListK.index<CartItem>().run { ShoppingCart.cartItems[productIndex].getOption(shoppingCart) }
![Page 429: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/429.jpg)
Optional (Get)
val cartItemOption = ShoppingCart .cartItems .index(ListK.index(), productIndex) .getOption(shoppingCart)
val sameCartItemOption = ListK.index<CartItem>().run { ShoppingCart.cartItems[productIndex].getOption(shoppingCart) }
![Page 430: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/430.jpg)
Optional (Get)
val cartItemOption = ShoppingCart .cartItems .index(ListK.index(), productIndex) .getOption(shoppingCart)
val sameCartItemOption = ListK.index<CartItem>().run { ShoppingCart.cartItems[productIndex].getOption(shoppingCart) }
![Page 431: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/431.jpg)
Optional (Get)
val cartItemOption = ShoppingCart .cartItems .index(ListK.index(), productIndex) .getOption(shoppingCart)
val sameCartItemOption = ListK.index<CartItem>().run { ShoppingCart.cartItems[productIndex].getOption(shoppingCart) }
![Page 432: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/432.jpg)
Optional (Get)
val cartItemOption = ShoppingCart .cartItems .index(ListK.index(), productIndex) .getOption(shoppingCart)
val sameCartItemOption = ListK.index<CartItem>().run { ShoppingCart.cartItems[productIndex].getOption(shoppingCart) }
![Page 433: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/433.jpg)
Optional (Get)
val cartItemOption = ShoppingCart .cartItems .index(ListK.index(), productIndex) .getOption(shoppingCart)
val sameCartItemOption = ListK.index<CartItem>().run { ShoppingCart.cartItems[productIndex].getOption(shoppingCart) }
![Page 434: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/434.jpg)
Optional (Get)
val cartItemOption = ShoppingCart .cartItems .index(ListK.index(), productIndex) .getOption(shoppingCart)
val sameCartItemOption = ListK.index<CartItem>().run { ShoppingCart.cartItems[productIndex].getOption(shoppingCart) }
![Page 435: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/435.jpg)
More…
• Iso
• Prism
• Getter / Setter
• Fold
• Each
• And others …
![Page 436: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/436.jpg)
That’s not it…
• Arrow Fx
• Effects
• Arrow Query Language
• Generic
• Integrations
• Free
• Recursion Schemes
![Page 437: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/437.jpg)
Resources
• https://arrow-kt.io/docs/
• http://learnyouahaskell.com/
• https://caster.io/courses/functional-programming-in-kotlin-with-arrow
• https://github.com/hemanth/functional-programming-jargon#function
• https://wiki.haskell.org/Typeclassopedia
• http://nealford.com/functionalthinking.html
• https://prod.packtpub.com/in/application-development/functional-kotlin
![Page 438: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/438.jpg)
end;@ragunathjawaharTwitter / Medium / GitHub
![Page 439: Functional Programming with Arrow in Kotlin · Functional Programming with Arrow in Kotlin @ragunathjawahar • Obvious (previously, Uncommon Bangalore)](https://reader036.vdocuments.us/reader036/viewer/2022062317/5edae3c909ac2c67fa68798b/html5/thumbnails/439.jpg)