Verifying that three cards make a "Set"
I feel there should be some way to iterate over the four properties instead of writing four separate lines.


You can use a higher-order function that takes in a function that returns a card property. Here is an example of how that could look. I've also simplified the code to the extent that none of the helper functions are needed, and changed some formatting to more idiomatic F#:

type Number = One | Two | Three
type Symbol = Round | Wavy | Diamond
type Shading = Empty | Lines | Full
type Colour = Red | Green | Blue

type Card =
    { Number: Number
      Symbol: Symbol
      Shading: Shading
      Colour: Colour}

let isSet card1 card2 card3 =
    let sameOrUniqueBy prop =
        let unique = [ card1; card2; card3 ] |&gt; List.distinctBy prop |&gt; List.length
        unique = 1 || unique = 3

    sameOrUniqueBy (fun c -&gt; c.Number)
    &amp;&amp; sameOrUniqueBy (fun c -&gt; c.Symbol)
    &amp;&amp; sameOrUniqueBy (fun c -&gt; c.Shading)
    &amp;&amp; sameOrUniqueBy (fun c -&gt; c.Colour)


In this code, sameOrUniqueBy is a higher-order function because it takes a function as an argument. It is defined as a local function inside isSet so that the cards don't have to be passed in each time it's used.

Testing:

let card1 = { Number = Two; Symbol = Round; Shading = Lines; Colour = Green }
let card2 = { Number = One; Symbol = Round; Shading = Empty; Colour = Green }
let card3 = { Number = Three; Symbol = Round; Shading = Full; Colour = Green }

isSet card1 card2 card3 = true // ✔

isSet card1 card1 card3 = false // ✔