Использование Haskell для интерпретации многострочных строк кода во время выполнения

Проблема:

Я хотел бы иметь возможность интерпретировать любой код Haskell во время выполнения, а также код, который не связан одной строкой.

Прямо сейчас я использую hint, чтобы сделать это ниже, что работает с отдельными строками:

html :: String -> IO String
html code = do    
    r <- runInterpreter $ do
        setImports ["Prelude"]
        interpret code (as :: () -> String)

    case r of
        Left err -> return $ show err
        Right func -> return $ func()

Пример:

Если code сверху равно \() -> "Hello World", это работает.

Но если code выглядит примерно так, как показано ниже, мой приведенный выше код не работает: (Обновление: работает).

\() -> let concatString :: String -> String -> String
           concatString str1 str2 = str1 ++ str2
       in concatString "Hello" "World"

Вопрос:

Как мне интерпретировать многострочные строки Haskell во время выполнения, используя подсказку или любую другую библиотеку?


Обновлять

Это работает - я сделал ошибку в исходном выражении (которую я сейчас исправил).


person jundl77    schedule 12.01.2019    source источник


Ответы (1)


Я не использовал подсказку, но могу сказать вам, что ваш пример не является допустимым выражением Haskell. Предложения where не присоединяются к выражениям, они присоединяются к определениям. То есть вы должны иметь знак =, чтобы иметь возможность иметь пункт where.

-- Correct
foo = bar
    where
    bar = baz
        where 
        baz = 42

-- Incorrect
foo = (bar + 1 where bar = 41)

Если вы хотите определить что-то в контексте выражения, вы должны использовать let

let concatString :: String -> String -> String
    concatString str1 str2 = str1 ++ str2
in concatString "Hello" "World"
person luqui    schedule 12.01.2019
comment
Ты прав! И это тоже было проблемой, использование оператора let работает, в том числе и с несколькими строками. Удивительно! Нет ли способа прикрепить определения к выражениям в Haskell? - person jundl77; 12.01.2019
comment
Есть, и это let. let : выражение :: where : определение. Вы даже можете поставить пункт where после определения, которое вы делаете в let (я думаю) - person luqui; 12.01.2019