Obtaining datatype field dynamically

Hello everyone,

I was testing the ability to generically retrieve a field from a datatype, where we don’t necessarily know any of the arguments, but still would want to show the name of the field we obtained. Is this something that’s possible, even if it doesn’t align to what I was testing?

test : forall a b c. (HasField a b c) => a -> b -> Script c
test field dataType = do
    debug field
    return $ getField @a dataType

Thanks in advance.

In Daml’s typesystem a record of a given type always has a fixed set of fields.

If you want to represent something with a varrying number of fields you can use something like a Map Text <yourvaluetypehere>.

1 Like

Right, I guess the point of that test function was more to review the possibility of debugging the name of a data type field while also calling it as a symbol for the getField function.
At the end of the day, what I’d like the result to be, could be something like so, without using variables:

test : (HasField "myField" b c, Show c) => b -> Script c
test dataType = script do
    let var = getField @"myField" dataType
    debug $ "myField:" <> show var
    return var

Thank you.

You cannot do this directly with HasField but you can define your own typeclass which gives you the field name at the value level. You then also have to define your own instances but depending on how frequently you use this, the boilerplate may be worth it:

{-# LANGUAGE AllowAmbiguousTypes #-}
module Main where

import DA.Record
import Daml.Script

data X = X { f : Text, g : Int }

class HasField a b c => HasField' a b c where
  fieldName : Text

instance HasField' "f" X Text where
  fieldName = "f"

instance HasField' "g" X Int where
  fieldName = "g"

debugField : forall f b c. (HasField' f b c, Show c) => b -> Script c
debugField dataType = script do
    let var = getField @f dataType
    debug $ fieldName @f @b @c <> ": " <> show var
    return var

testFieldNames = script do
  let x = X "abc" 42
  debugField @"f" x
  debugField @"g" x
1 Like

Thank you very much, I’ll review the need of using something like this.