Haskell:
Interpolera en sträng

Hur man gör:

I Haskell hanterar vi inte stringinterpolation ur lådan. Men med biblioteket Data.Text, och Template Haskell-funktionen printf från Text.Printf, är det enkelt. Här är ett exempel:

{-# LANGUAGE OverloadedStrings #-}

import Text.Printf (printf)
import Data.Text (pack, unpack, Text)

main :: IO ()
main = do
  let name = "Elsa"
  let age = 26
  putStrLn $ unpack (interpolate name age)

interpolate :: String -> Int -> Text
interpolate name age = pack (printf "Hej, jag heter %s och jag är %d år gammal." name age)

-- Output
-- Hej, jag heter Elsa och jag är 26 år gammal.

Djupdykning

Stringinterpolering som koncept har funnits länge i programmering, ofta inbyggt i språk som Python och JavaScript. Haskell, som är starkt typat och fokuserar på funktionell renhet, har inte inbyggd interpolering. Det beror på att funktioner som printf kan vara otydliga och potentiellt osäkra.

Men med paket som Data.Text och Template Haskell kan vi lika enkelt interpolera strängar. Text.Printf-modulen är inspirerad av C’s printf och tillhandahåller en typsäker variant av C’s funktion.

En annan metod för stringinterpolering i Haskell är genom interpolate biblioteket, som erbjuder en mer typsäker och uttrycksfull syntax. Till exempel kan du använda [i|...|] quasi-litteraler för att interpolera:

{-# LANGUAGE QuasiQuotes #-}

import Data.String.Interpolate (i)

name = "Olle"
age = 30

main :: IO ()
main = putStrLn [i|Hej, jag heter #{name} och jag är #{age} år gammal.|]

-- Output
-- Hej, jag heter Olle och jag är 30 år gammal.

Kom ihåg, när du använder interpolering, att hålla ett öga på prestanda, eftersom det kan vara mer kostsamt än att slå samman strängar (concatenation).

Se även