Elm:
Textdatei einlesen

How to:

Elm macht direktes Einlesen von Dateien etwas anders – es verwendet hauptsächlich Ports und Subscriptions, um Dateien über JavaScript zu verarbeiten. Hier ist ein kleines Beispiel mit einem Port:

port module Main exposing (..)

import Html exposing (Html, button, div, text)
import Html.Events exposing (onClick)

port readFile : String -> Cmd msg
port fileRead : (String -> msg) -> Sub msg

type Msg = ReadFile | FileRead String

main =
    Html.program
        { init = ( "Click to read file", Cmd.none )
        , view = view
        , update = update
        , subscriptions = \_ -> fileRead FileRead
        }

view model =
    div []
        [ button [ onClick ReadFile ] [ text "Read File" ]
        , div [] [ text model ]
        ]

update msg model =
    case msg of
        ReadFile ->
            ( model, readFile "filename.txt" )
            
        FileRead contents ->
            ( contents, Cmd.none )

Deep Dive:

Historisch gesehen ist Elm stark auf Web-Anwendungen ausgerichtet, weshalb direkter Zugriff auf das Dateisystem nicht Teil des Sprachdesigns ist. Alternativ kommt man über JavaScript-Interoperabilität ans Ziel: Mit Ports sendet man Signale an JavaScript, das dann die Dateioperationen handhabt. Der Umgang mit Ports ist für side-effect-behaftete Operationen wie Dateizugriffe typisch. Das stellt sicher, dass Eure pure Funktionen rein bleiben.

See Also: