647 search results for ""
-
A Tour of OCaml
Using the result Type
So one may write: Another way to deal with errors in OCaml is by returning value of type result , which can represent either the correct result or an error. Here is how it is defined:
First Steps -
Debugging
Launching the Debugger
Then the debugger answers with a banner and a prompt: We launch the debugger: At runtime, the program raises an uncaught exception Not_found . Suppose we want to find where and why this e
Guides -
OCaml Programming Guidelines
Width of the Page
Justification : This width makes it possible to read the code on all displays and to print it in a legible font on a standard sheet. The page is 80 columns wide.
Resources -
Command-line Arguments
Sys.argv
<!-- $MDX dir=examples --> Note that ocaml launched a subprocess that actually runs the program where argv is args.ml arg1 arg2 arg3 . You can also compile your program using ocamlopt -o ar
Tutorials -
Fix Homebrew Errors on Apple M1
Install CLT
If they're not installed, let's install them now. You don't have to install all of XCode; you can install just the CLT by downloading them directly from Apple's Developer . Look for a non-beta versi
Resources -
Profiling
Further Reading
<!--### Java dynamic dispatch **There are some serious mistakes in the last paragraph:** * Dynamic method dispatch itself is seldom a performance problem. In languages without multiple inheritance
Guides -
Sequences
Fibs with Seq.Cons
<!-- Or with an int version ``` ocaml # ints_v2 1 |> Seq.take 10 |> List.of_seq;; - : int list = [1; 2; 3; 4; 5; 6; 7; 8; 9; 10] ``` --> This implementation successfully defines a producer of laz
Data Structures -
Values and Functions
Introduction
We use UTop to understand these concepts by example. You are encouraged to modify the examples to gain a better understanding. In OCaml, functions are treated as values, so you can use functions as
Introduction -
Maps
Changing the Value Associated With a Key
You should experiment with different update functions; several behaviors are possible. To change a key's associated value, use the update function. It takes a key, a map, and an update functio
Data Structures -
OCaml Programming Guidelines
Iterators
In case of express need, be sure to add an explanatory comment. In my opinion, it's absolutely necessary! <!-- $MDX skip --> even though you get: <!-- $MDX skip --> On the other hand, avoid w
Resources -
OCaml Programming Guidelines
How to Compile
The make utility is indispensable for managing the compilation and recompilation of programs. Sample make files can be found on The Hump . You can also consult the Makefiles for the OCam
Resources -
Memory Representation of Values
Conclusion
Understanding the Garbage Collector Calling C Libraries Other recommended tutorials: We covered the precise mapping from OCaml types to their internal runtime representation in memory, which shou
Runtime & Compiler -
Profiling
Tail Recursion
So that's pretty conclusive. Calling Tail__loop_56 will first print the string, and then jump back to the top, then print the string, and jump back, and so on forever. It's a simple loop, not
Guides -
Values and Functions
Pattern Matching on User-Defined Types
This also works with user-defined types.
Introduction -
Values and Functions
Closures
Inside the max_42 function, the environment contains an additional binding between the first parameter of max and the value 42. Partially applying arguments to a function also creates a new clo
Introduction -
Basic Data Types and Pattern Matching
Characters
The module Uchar provides support for Unicode characters. Operations on char values are provided by the Stdlib and the Char modules. Values of type char correspond to the 256 symbols of
Introduction -
Sequences
Consumer Example: Seq.iter
In print_seq , Seq.iter takes the function print_int and applies it to each element as they are generated. If List.iter was used, the whole integer list would be needed before displaying the
Data Structures -
Error Handling
Language Bugs
Here is an example of such a bug: <https://github.com/ocaml/ocaml/issues/7241> Make sure the crash affects both compilers: bytecode and native Write a self-contained and minimal proof-of-concept co
Guides -
Objects
A Note About self
The reference to self names the object, allowing you to call methods in the same class or pass the object to functions outside the class. In other words, it's exactly the same as this in C++
Advanced Topics -
Arrays
Folding an Array
These functions derive a single value from the whole array. For example, they can be used to find the maximum element of an array: fold_right f a init computes f a.(0) (f a.(1) ( ... (f a.(n-1)
Data Structures -
Maps
Maps With Custom Key Types
Note that our module has a type t and also a compare function. Now we can call the Map.Make functor to get a map for non-negative numbers: We'll start by defining a module for strings th
Data Structures -
Sequences
Producer Example: Seq.unfold
This application of Seq.unfold has type unit -> int Seq.node , making it a function, a deferred producer. Each time this function is called, a new element is produced.
Data Structures -
A Tour of OCaml
Functions
Some functions, such as String.ends_with have labelled parameters. Labels are useful when a function has several parameters of the same type; naming arguments allows to guess their purpose. Above,
First Steps -
Sequences
Fibs with Seq.cons
This produces a never-ending recursion that leads to a stack overflow. <!-- Or with an int version: ```ocaml # let rec ints_v1 n = Seq.cons n (n + 1);; val fibs : int -> int -> int Seq.t = <fun> #
Data Structures -
OCaml Programming Guidelines
Naming Complex Arguments
<!-- $MDX skip --> write <!-- $MDX skip --> In place of
Resources -
Modules
Submodule Implementation
dune Definitions from a submodule are accessed by chaining module names, here Florence.Hello.print . Here is the updated dune file, with an additional executable: glasgow.ml florence.ml
Module System -
Loops and Recursions
Recursion
In the first example, we'll read the whole file into memory (into a long string). There are essentially three possible approaches to this: Writing recursive functions requires a change in mindse
Introduction -
Maps
Finding Entries in a Map
Note that find_first_opt and find_last_opt return the key-value pair, not just the value. The functions find_first and find_last behave similarly, except they throw exceptions instead of
Data Structures -
Options
The Standard Library Option Module
Most of the functions in this section, as well as other useful ones, are provided by the OCaml standard library in the Stdlib.Option module.
Data Structures -
Error Handling
Exceptions
Here, we add a variant Foo to the type exn and create a function that will raise this exception. Now, how do we handle exceptions? The construct is try ... with ... : Exceptions belong to
Guides -
Basic Data Types and Pattern Matching
Results
Operations on results are provided by the Result module. Results are discussed in the Error Handling guide. The result type can be used to express that a function's outcome can be either succ
Introduction -
File Manipulation
Gotchas
Don't forget to flush your out_channel s if you want to actually write something. This is particularly important if you are writing to non-files such as the standard output ( stdout ) or a socke
Tutorials -
OCaml on Windows
Vim and Emacs
If you use Vim , the default Cygwin Vim will not work with Merlin. You will need install Vim separately. In addition to the usual instructions printed when installing Merlin, you may need to se
Resources -
Mutability and Imperative Control Flow
Arrays
For a more detailed discussion on arrays, see the Arrays tutorial. the array location to update (when on the left-hand side of <- ), or the cell's content (when on the right-hand side of <- ). T
Introduction -
File Manipulation
Buffered Channels
channels that write to a file: type out_channel channels that read from a file: type in_channel The normal way of opening a file in OCaml returns a channel . There are two kinds of channels:
Tutorials -
Sequences
Consumers vs Producers
A function with a sequence parameter consumes it; it's a sequence consumer. A function with a sequence result produces it; it's a sequence producer. In both cases, consumption and production occurs o
Data Structures -
Arrays
Modifying Array Elements
Note that this operation returns unit , not the modified array. even_numbers is modified in place as a side effect. To modify an element in an array, we simply assign a new value to it using th
Data Structures -
Debugging
Setting Break Points
Now we can guess why List.assoc will fail to find "INRIA" in the list... Then, we can step and find what happens just before ( <|b|> ) List.assoc is about to be called in find_address : L
Guides -
Configuring Your Editor
Windows Users
If you used the DkML distribution, you will need to: 1. Go to File > Preferences > Settings view (or press Ctrl , ) 2. Select User > Extensions > OCaml Platform 3. Uncheck OCaml: U
Tooling -
Your First OCaml Program
Conclusion
<!-- TODO: link Project Quickstart If you're already familiar with lists, maps, and folds, and need to be productive as fast as possible, dive into the “Project Quickstart” guide. --> This tuto
First Steps -
Modules
Submodule With Signatures
The first version made Florence.Hello.message public. In this version it can't be accessed from glasgow.ml . To define a submodule's interface, we can provide a module signature . This is do
Module System -
Options
Peel-Off Doubly Wrapped Options
In the standard library, this is Option.join . Here is join of type 'a option option -> 'a option . It peels off one layer from a doubly wrapped option:
Data Structures -
Arrays
Accessing Array Elements
You can access individual elements of an array using the .(index) syntax, with the index of the element you want to access. The index of the first element is 0, and the index of the last element
Data Structures -
Basic Data Types and Pattern Matching
Options
Operations on options are provided by the Option module. Options are discussed in the Error Handling guide. Here is an example of pattern matching on an option value: The option type is a
Introduction -
Values and Functions
The Pipe Operator
This is just like a Unix shell pipe. The pipe operator ( |> ) also avoids parentheses but in reversed order: function on right, argument on left.
Introduction -
OCaml Programming Guidelines
Delimiters
A space should always follow a delimiter symbol, and spaces should surround operator symbols. It has been a great step forward in typography to separate words by spaces in order to make written t
Resources -
A Tour of OCaml
Anonymous Functions
We can write anonymous functions and immediately apply them to a value: Anonymous functions do not have a name, and they are defined with the fun keyword:
First Steps -
Basic Data Types and Pattern Matching
Type Aliases
This is mostly useful as a means of documentation or to shorten long type expressions. Just like values, any type can be given a name.
Introduction -
Installing OCaml
Join the Community
Make sure you join the OCaml community . You'll find many community members on Discuss or Discord . These are great places to ask for help if you have any issues.
First Steps -
Operators
Unary Operators
This allows users to write more compact code. However, be careful not to write excessively terse code, as it is harder to maintain. Understanding operators must be obvious to most readers, otherwise
Advanced Topics