Подтвердить что ты не робот

Использование Emoji в Haskell

Недавно я наткнулся на бот в Twitter под названием EmojiHaskell, который утверждает, что чирикает "интерпретируемый код Haskell с именами переменных emoji". Особый Tweet привлек мое внимание, поскольку это выглядело как неправильный синтаксис для меня, поэтому я решил поближе рассмотреть. До сих пор я выпустил следующий код:

module Main where

🙏 :: [🍳] -> Maybe 🍳
🙏 [] = Nothing
🙏 (👽:as) = Just 👽

main = print $ 🙏 "♥"

Поскольку я использовал λ иногда в моем коде Haskell, я ожидал, что этот код будет работать, но похоже, что GHC вообще не нравится emoji.

С $ runhaskell Main.hs я получаю:

Main.hs: 4: 1: ошибка синтаксического анализа на входе '🙏

Я уже рассмотрел расширение UnicodeSyntax, и пытались использовать только некоторые или отдельные эможи, а не все, чтобы увидеть, вызвал ли какой-то вопрос проблему.

Теперь мой вопрос таков: Есть ли в настоящее время компилятор Haskell, который бы принял код? Могу ли я заставить GHC работать с этим кодом каким-то образом?

4b9b3361

Ответ 1

Этот код недействителен haskell. Причина в том, что 🙏 (как, вероятно, все Emojis) является символьным символом:

Prelude> import Data.Char
Prelude Data.Char> generalCategory '🙏'
OtherSymbol

Но вы все равно можете использовать их как любой другой символ, а именно как оператор:

Prelude Data.Char> let (🙏) = (+)
Prelude Data.Char> 32 🙏 42
74

Кроме того, как указал пользователь3237465, если вы используете синтаксис префикса для операторов, то есть поместите его в круглые скобки, вы можете использовать его как любой другой символ:

(🙏) :: [a] -> Maybe a
(🙏) [] = Nothing
(🙏) ((👽):as) = Just (👽)

main = print $ (🙏) "♥"

Это почти пример в исходном посте. К сожалению, этот трюк не работает для переменной типа. документация написана немного, к сожалению, но фактически символы никогда не являются переменными типа и всегда строят конструкторы