Description

Book Synopsis

Michel Charpentier is an associate professor with the Computer Science department at the University of New Hampshire (UNH). His interests over the years have ranged from distributed systems to formal verification and mobile sensor networks. He has been with UNH since 1999 and currently teaches courses in programming languages, concurrency, formal verification, and model-checking.



Table of Contents

Foreword by Cay Horstmann xxiii

Preface xxv

Acknowledgments xxxv

About the Author xxxvii

Part I. Functional Programming 1

Chapter 1: Concepts of Functional Programming 3

1.1 What Is Functional Programming? 3

1.2 Functions 4

1.3 From Functions to Functional Programming Concepts 6

1.4 Summary 7

Chapter 2: Functions in Programming Languages 9

2.1 Defining Functions 9

2.2 Composing Functions 10

2.3 Functions Defined as Methods 12

2.4 Operators Defined as Methods 12

2.5 Extension Methods 13

2.6 Local Functions 14

2.7 Repeated Arguments 15

2.8 Optional Arguments 16

2.9 Named Arguments 16

2.10 Type Parameters 17

2.11 Summary 19

Chapter 3: Immutability 21

3.1 Pure and Impure Functions 21

3.2 Actions 23

3.3 Expressions Versus Statements 25

3.4 Functional Variables 26

3.5 Immutable Objects 28

3.6 Implementation of Mutable State 29

3.7 Functional Lists 31

3.8 Hybrid Designs 32

3.9 Updating Collections of Mutable/Immutable Objects 35

3.10 Summary 36

Chapter 4: Case Study: Active–Passive Sets 39

4.1 Object-Oriented Design 39

4.2 Functional Values 41

4.3 Functional Objects 43

4.4 Summary 44

Chapter 5: Pattern Matching and Algebraic Data Types 47

5.1 Functional Switch 47

5.2 Tuples 48

5.3 Options 50

5.4 Revisiting Functional Lists 51

5.5 Trees 53

5.6 Illustration: List Zipper 56

5.7 Extractors 59

5.8 Summary 60

Chapter 6: Recursive Programming 63

6.1 The Need for Recursion 63

6.2 Recursive Algorithms 65

6.3 Key Principles of Recursive Algorithms 67

6.4 Recursive Structures 69

6.5 Tail Recursion 71

6.6 Examples of Tail Recursive Functions 73

6.7 Summary 77

Chapter 7: Recursion on Lists 79

7.1 Recursive Algorithms as Equalities 79

7.2 Traversing Lists 80

7.3 Returning Lists 82

7.4 Building Lists from the Execution Stack 84

7.5 Recursion on Multiple/Nested Lists 85

7.6 Recursion on Sublists Other Than the Tail 88

7.7 Building Lists in Reverse Order 90

7.8 Illustration: Sorting 92

7.9 Building Lists Efficiently 94

7.10 Summary 96

Chapter 8: Case Study: Binary Search Trees 99

8.1 Binary Search Trees 99

8.2 Sets of Integers as Binary Search Trees 100

8.3 Implementation Without Rebalancing 102

8.4 Self-Balancing Trees 107

8.5 Summary 113

Chapter 9: Higher-Order Functions 115

9.1 Functions as Values 115

9.2 Currying 118

9.3 Function Literals 120

9.4 Functions Versus Methods 123

9.5 Single-Abstract-Method Interfaces 124

9.6 Partial Application 125

9.7 Closures 130

9.8 Inversion of Control 133

9.9 Summary 133

Chapter 10: Standard Higher-Order Functions 137

10.1 Functions with Predicate Arguments 137

10.2 map and foreach 140

10.3 atMap 141

10.4 fold and reduce 146

10.5 iterate, tabulate, and unfold 148

10.6 sortWith, sortBy, maxBy, and minBy 149

10.7 groupBy and groupMap 150

10.8 Implementing Standard Higher-Order Functions 152

10.9 foreach, map, atMap, and for-Comprehensions 152

10.10 Summary 155

Chapter 11: Case Study: File Systems as Trees 157

11.1 Design Overview 157

11.2 A Node-Searching Helper Function 158

11.3 String Representation 158

11.4 Building Trees 160

11.5 Querying 164

11.6 Navigation 168

11.7 Tree Zipper 169

11.8 Summary 172

Chapter 12: Lazy Evaluation 173

12.1 Delayed Evaluation of Arguments 173

12.2 By-Name Arguments 174

12.3 Control Abstraction 176

12.4 Internal Domain-Specifc Languages 179

12.5 Streams as Lazily Evaluated Lists 180

12.6 Streams as Pipelines 182

12.7 Streams as Infinite Data Structures 184

12.8 Iterators 184

12.9 Lists, Streams, Iterators, and Views 187

12.10 Delayed Evaluation of Fields and Local Variables 190

12.11 Illustration: Subset-Sum 191

12.12 Summary 193

Chapter 13: Handling Failures 195

13.1 Exceptions and Special Values 195

13.2 Using Option 197

13.3 Using Try 198

13.4 Using Either 199

13.5 Higher-Order Functions and Pipelines 201

13.6 Summary 204

Chapter 14: Case Study: Trampolines 205

14.1 Tail-Call Optimization 205

14.2 Trampolines for Tail-Calls 206

14.3 Tail-Call Optimization in Java 207

14.4 Dealing with Non-Tail-Calls 209

14.5 Summary 213

A Brief Interlude 215

Chapter 15: Types (and Related Concepts) 217

15.1 Typing Strategies 217

15.2 Types as Sets 222

15.3 Types as Services 223

15.4 Abstract Data Types 224

15.5 Type Inference 225

15.6 Subtypes 229

15.7 Polymorphism 232

15.8 Type Variance 235

15.9 Type Bounds 241

15.10 Type Classes 245

15.11 Summary 250

Part II. Concurrent Programming 253

Chapter 16: Concepts of Concurrent Programming 255

16.1 Non-sequential Programs 255

16.2 Concurrent Programming Concepts 258

16.3 Summary 259

Chapter 17: Threads and Nondeterminism 261

17.1 Threads of Execution 261

17.2 Creating Threads Using Lambda Expressions 263

17.3 Nondeterministic Behavior of Multithreaded Programs 263

17.4 Thread Termination 264

17.5 Testing and Debugging Multithreaded Programs 266

17.6 Summary 268

Chapter 18: Atomicity and Locking 271

18.1 Atomicity 271

18.2 Non-atomic Operations 273

18.3 Atomic Operations and Non-atomic Composition 274

18.4 Locking 278

18.5 Intrinsic Locks 279

18.6 Choosing Locking Targets 281

18.7 Summary 283

Chapter 19: Thread-Safe Objects 285

19.1 Immutable Objects 285

19.2 Encapsulating Synchronization Policies 286

19.3 Avoiding Reference Escape 288

19.4 Public and Private Locks 289

19.5 Leveraging Immutable Types 290

19.6 Thread-Safety 293

19.7 Summary 295

Chapter 20: Case Study: Thread-Safe Queue 297

20.1 Queues as Pairs of Lists 297

20.2 Single Public Lock Implementation 298

20.3 Single Private Lock Implementation 301

20.4 Applying Lock Splitting 303

20.5 Summary 305

Chapter 21: Thread Pools 307

21.1 Fire-and-Forget Asynchronous Execution 307

21.2 Illustration: Parallel Server 309

21.3 Different Types of Thread Pools 312

21.4 Parallel Collections 314

21.5 Summary 318

Chapter 22: Synchronization 321

22.1 Illustration of the Need for Synchronization 321

22.2 Synchronizers 324

22.3 Deadlocks 325

22.4 Debugging Deadlocks with Thread Dumps 328

22.5 The Java Memory Model 330

22.6 Summary 335

Chapter 23: Common Synchronizers 337

23.1 Locks 337

23.2 Latches and Barriers 339

23.3 Semaphores 341

23.4 Conditions 343

23.5 Blocking Queues 349

23.6 Summary 353

Chapter 24: Case Study: Parallel Execution 355

24.1 Sequential Reference Implementation 355

24.2 One New Thread per Task 356

24.3 Bounded Number of Threads 357

24.4 Dedicated Thread Pool 359

24.5 Shared Thread Pool 360

24.6 Bounded Thread Pool 361

24.7 Parallel Collections 362

24.8 Asynchronous Task Submission Using Conditions 362

24.9 Two-Semaphore Implementation 367

24.10 Summary 368

Chapter 25: Futures and Promises 369

25.1 Functional Tasks 369

25.2 Futures as Synchronizers 371

25.3 Timeouts, Failures, and Cancellation 374

25.4 Future Variants 375

25.5 Promises 375

25.6 Illustration: Thread-Safe Caching 377

25.7 Summary 379

Chapter 26: Functional-Concurrent Programming 381

26.1 Correctness and Performance Issues with Blocking 381

26.2 Callbacks 384

26.3 Higher-Order Functions on Futures 385

26.4 Function atMap on Futures 388

26.5 Illustration: Parallel Server Revisited 390

26.6 Functional-Concurrent Programming Patterns 393

26.7 Summary 397

Chapter 27: Minimizing Thread Blocking 399

27.1 Atomic Operations 399

27.2 Lock-Free Data Structures 402

27.3 Fork/Join Pools 405

27.4 Asynchronous Programming 406

27.5 Actors 407

27.6 Reactive Streams 411

27.7 Non-blocking Synchronization 412

27.8 Summary 414

Chapter 28: Case Study: Parallel Strategies 417

28.1 Problem Definition 417

28.2 Sequential Implementation with Timeout 419

28.3 Parallel Implementation Using invokeAny 420

28.4 Parallel Implementation Using CompletionService 421

28.5 Asynchronous Implementation with Scala Futures 422

28.6 Asynchronous Implementation with CompletableFuture 426

28.7 Caching Results from Strategies 427

28.8 Summary 431

Appendix A. Features of Java and Kotlin 433

A.1 Functions in Java and Kotlin 433

A.2 Immutability 436

A.3 Pattern Matching and Algebraic Data Types 437

A.4 Recursive Programming 439

A.5 Higher-Order Functions 440

A.6 Lazy Evaluation 446

A.7 Handling Failures 449

A.8 Types 451

A.9 Threads 453

A.10 Atomicity and Locking 454

A.11 Thread-Safe Objects 455

A.12 Thread Pools 457

A.13 Synchronization 459

A.14 Futures and Functional-Concurrent Programming 460

A.15 Minimizing Thread Blocking 461

Glossary 463

Index 465

Functional and Concurrent Programming

    Product form

    £37.79

    Includes FREE delivery

    RRP £41.99 – you save £4.20 (10%)

    Order before 4pm today for delivery by Fri 26 Jun 2026.

    A Paperback / softback by Michel Charpentier

      Trusted by thousands of customers. See 2,385+ Customer Reviews

      View other formats and editions of Functional and Concurrent Programming by Michel Charpentier

      Publisher: Pearson Education (US)
      Publication Date: 16/01/2023
      ISBN13: 9780137466542, 978-0137466542
      ISBN10: 137466544

      Description

      Book Synopsis

      Michel Charpentier is an associate professor with the Computer Science department at the University of New Hampshire (UNH). His interests over the years have ranged from distributed systems to formal verification and mobile sensor networks. He has been with UNH since 1999 and currently teaches courses in programming languages, concurrency, formal verification, and model-checking.



      Table of Contents

      Foreword by Cay Horstmann xxiii

      Preface xxv

      Acknowledgments xxxv

      About the Author xxxvii

      Part I. Functional Programming 1

      Chapter 1: Concepts of Functional Programming 3

      1.1 What Is Functional Programming? 3

      1.2 Functions 4

      1.3 From Functions to Functional Programming Concepts 6

      1.4 Summary 7

      Chapter 2: Functions in Programming Languages 9

      2.1 Defining Functions 9

      2.2 Composing Functions 10

      2.3 Functions Defined as Methods 12

      2.4 Operators Defined as Methods 12

      2.5 Extension Methods 13

      2.6 Local Functions 14

      2.7 Repeated Arguments 15

      2.8 Optional Arguments 16

      2.9 Named Arguments 16

      2.10 Type Parameters 17

      2.11 Summary 19

      Chapter 3: Immutability 21

      3.1 Pure and Impure Functions 21

      3.2 Actions 23

      3.3 Expressions Versus Statements 25

      3.4 Functional Variables 26

      3.5 Immutable Objects 28

      3.6 Implementation of Mutable State 29

      3.7 Functional Lists 31

      3.8 Hybrid Designs 32

      3.9 Updating Collections of Mutable/Immutable Objects 35

      3.10 Summary 36

      Chapter 4: Case Study: Active–Passive Sets 39

      4.1 Object-Oriented Design 39

      4.2 Functional Values 41

      4.3 Functional Objects 43

      4.4 Summary 44

      Chapter 5: Pattern Matching and Algebraic Data Types 47

      5.1 Functional Switch 47

      5.2 Tuples 48

      5.3 Options 50

      5.4 Revisiting Functional Lists 51

      5.5 Trees 53

      5.6 Illustration: List Zipper 56

      5.7 Extractors 59

      5.8 Summary 60

      Chapter 6: Recursive Programming 63

      6.1 The Need for Recursion 63

      6.2 Recursive Algorithms 65

      6.3 Key Principles of Recursive Algorithms 67

      6.4 Recursive Structures 69

      6.5 Tail Recursion 71

      6.6 Examples of Tail Recursive Functions 73

      6.7 Summary 77

      Chapter 7: Recursion on Lists 79

      7.1 Recursive Algorithms as Equalities 79

      7.2 Traversing Lists 80

      7.3 Returning Lists 82

      7.4 Building Lists from the Execution Stack 84

      7.5 Recursion on Multiple/Nested Lists 85

      7.6 Recursion on Sublists Other Than the Tail 88

      7.7 Building Lists in Reverse Order 90

      7.8 Illustration: Sorting 92

      7.9 Building Lists Efficiently 94

      7.10 Summary 96

      Chapter 8: Case Study: Binary Search Trees 99

      8.1 Binary Search Trees 99

      8.2 Sets of Integers as Binary Search Trees 100

      8.3 Implementation Without Rebalancing 102

      8.4 Self-Balancing Trees 107

      8.5 Summary 113

      Chapter 9: Higher-Order Functions 115

      9.1 Functions as Values 115

      9.2 Currying 118

      9.3 Function Literals 120

      9.4 Functions Versus Methods 123

      9.5 Single-Abstract-Method Interfaces 124

      9.6 Partial Application 125

      9.7 Closures 130

      9.8 Inversion of Control 133

      9.9 Summary 133

      Chapter 10: Standard Higher-Order Functions 137

      10.1 Functions with Predicate Arguments 137

      10.2 map and foreach 140

      10.3 atMap 141

      10.4 fold and reduce 146

      10.5 iterate, tabulate, and unfold 148

      10.6 sortWith, sortBy, maxBy, and minBy 149

      10.7 groupBy and groupMap 150

      10.8 Implementing Standard Higher-Order Functions 152

      10.9 foreach, map, atMap, and for-Comprehensions 152

      10.10 Summary 155

      Chapter 11: Case Study: File Systems as Trees 157

      11.1 Design Overview 157

      11.2 A Node-Searching Helper Function 158

      11.3 String Representation 158

      11.4 Building Trees 160

      11.5 Querying 164

      11.6 Navigation 168

      11.7 Tree Zipper 169

      11.8 Summary 172

      Chapter 12: Lazy Evaluation 173

      12.1 Delayed Evaluation of Arguments 173

      12.2 By-Name Arguments 174

      12.3 Control Abstraction 176

      12.4 Internal Domain-Specifc Languages 179

      12.5 Streams as Lazily Evaluated Lists 180

      12.6 Streams as Pipelines 182

      12.7 Streams as Infinite Data Structures 184

      12.8 Iterators 184

      12.9 Lists, Streams, Iterators, and Views 187

      12.10 Delayed Evaluation of Fields and Local Variables 190

      12.11 Illustration: Subset-Sum 191

      12.12 Summary 193

      Chapter 13: Handling Failures 195

      13.1 Exceptions and Special Values 195

      13.2 Using Option 197

      13.3 Using Try 198

      13.4 Using Either 199

      13.5 Higher-Order Functions and Pipelines 201

      13.6 Summary 204

      Chapter 14: Case Study: Trampolines 205

      14.1 Tail-Call Optimization 205

      14.2 Trampolines for Tail-Calls 206

      14.3 Tail-Call Optimization in Java 207

      14.4 Dealing with Non-Tail-Calls 209

      14.5 Summary 213

      A Brief Interlude 215

      Chapter 15: Types (and Related Concepts) 217

      15.1 Typing Strategies 217

      15.2 Types as Sets 222

      15.3 Types as Services 223

      15.4 Abstract Data Types 224

      15.5 Type Inference 225

      15.6 Subtypes 229

      15.7 Polymorphism 232

      15.8 Type Variance 235

      15.9 Type Bounds 241

      15.10 Type Classes 245

      15.11 Summary 250

      Part II. Concurrent Programming 253

      Chapter 16: Concepts of Concurrent Programming 255

      16.1 Non-sequential Programs 255

      16.2 Concurrent Programming Concepts 258

      16.3 Summary 259

      Chapter 17: Threads and Nondeterminism 261

      17.1 Threads of Execution 261

      17.2 Creating Threads Using Lambda Expressions 263

      17.3 Nondeterministic Behavior of Multithreaded Programs 263

      17.4 Thread Termination 264

      17.5 Testing and Debugging Multithreaded Programs 266

      17.6 Summary 268

      Chapter 18: Atomicity and Locking 271

      18.1 Atomicity 271

      18.2 Non-atomic Operations 273

      18.3 Atomic Operations and Non-atomic Composition 274

      18.4 Locking 278

      18.5 Intrinsic Locks 279

      18.6 Choosing Locking Targets 281

      18.7 Summary 283

      Chapter 19: Thread-Safe Objects 285

      19.1 Immutable Objects 285

      19.2 Encapsulating Synchronization Policies 286

      19.3 Avoiding Reference Escape 288

      19.4 Public and Private Locks 289

      19.5 Leveraging Immutable Types 290

      19.6 Thread-Safety 293

      19.7 Summary 295

      Chapter 20: Case Study: Thread-Safe Queue 297

      20.1 Queues as Pairs of Lists 297

      20.2 Single Public Lock Implementation 298

      20.3 Single Private Lock Implementation 301

      20.4 Applying Lock Splitting 303

      20.5 Summary 305

      Chapter 21: Thread Pools 307

      21.1 Fire-and-Forget Asynchronous Execution 307

      21.2 Illustration: Parallel Server 309

      21.3 Different Types of Thread Pools 312

      21.4 Parallel Collections 314

      21.5 Summary 318

      Chapter 22: Synchronization 321

      22.1 Illustration of the Need for Synchronization 321

      22.2 Synchronizers 324

      22.3 Deadlocks 325

      22.4 Debugging Deadlocks with Thread Dumps 328

      22.5 The Java Memory Model 330

      22.6 Summary 335

      Chapter 23: Common Synchronizers 337

      23.1 Locks 337

      23.2 Latches and Barriers 339

      23.3 Semaphores 341

      23.4 Conditions 343

      23.5 Blocking Queues 349

      23.6 Summary 353

      Chapter 24: Case Study: Parallel Execution 355

      24.1 Sequential Reference Implementation 355

      24.2 One New Thread per Task 356

      24.3 Bounded Number of Threads 357

      24.4 Dedicated Thread Pool 359

      24.5 Shared Thread Pool 360

      24.6 Bounded Thread Pool 361

      24.7 Parallel Collections 362

      24.8 Asynchronous Task Submission Using Conditions 362

      24.9 Two-Semaphore Implementation 367

      24.10 Summary 368

      Chapter 25: Futures and Promises 369

      25.1 Functional Tasks 369

      25.2 Futures as Synchronizers 371

      25.3 Timeouts, Failures, and Cancellation 374

      25.4 Future Variants 375

      25.5 Promises 375

      25.6 Illustration: Thread-Safe Caching 377

      25.7 Summary 379

      Chapter 26: Functional-Concurrent Programming 381

      26.1 Correctness and Performance Issues with Blocking 381

      26.2 Callbacks 384

      26.3 Higher-Order Functions on Futures 385

      26.4 Function atMap on Futures 388

      26.5 Illustration: Parallel Server Revisited 390

      26.6 Functional-Concurrent Programming Patterns 393

      26.7 Summary 397

      Chapter 27: Minimizing Thread Blocking 399

      27.1 Atomic Operations 399

      27.2 Lock-Free Data Structures 402

      27.3 Fork/Join Pools 405

      27.4 Asynchronous Programming 406

      27.5 Actors 407

      27.6 Reactive Streams 411

      27.7 Non-blocking Synchronization 412

      27.8 Summary 414

      Chapter 28: Case Study: Parallel Strategies 417

      28.1 Problem Definition 417

      28.2 Sequential Implementation with Timeout 419

      28.3 Parallel Implementation Using invokeAny 420

      28.4 Parallel Implementation Using CompletionService 421

      28.5 Asynchronous Implementation with Scala Futures 422

      28.6 Asynchronous Implementation with CompletableFuture 426

      28.7 Caching Results from Strategies 427

      28.8 Summary 431

      Appendix A. Features of Java and Kotlin 433

      A.1 Functions in Java and Kotlin 433

      A.2 Immutability 436

      A.3 Pattern Matching and Algebraic Data Types 437

      A.4 Recursive Programming 439

      A.5 Higher-Order Functions 440

      A.6 Lazy Evaluation 446

      A.7 Handling Failures 449

      A.8 Types 451

      A.9 Threads 453

      A.10 Atomicity and Locking 454

      A.11 Thread-Safe Objects 455

      A.12 Thread Pools 457

      A.13 Synchronization 459

      A.14 Futures and Functional-Concurrent Programming 460

      A.15 Minimizing Thread Blocking 461

      Glossary 463

      Index 465

      Recently viewed products

      © 2026 Book Curl

        • American Express
        • Apple Pay
        • Diners Club
        • Discover
        • Google Pay
        • Maestro
        • Mastercard
        • PayPal
        • Shop Pay
        • Union Pay
        • Visa

        Login

        Forgot your password?

        Don't have an account yet?
        Create account