2015-08-12 13 views
28

Kısa bir süre önce Twitter'da EmojiHaskell adlı bir botla karşılaştım, bu da 'emoji değişken isimleriyle' yorumlanabilir Haskell kodunu 'tweet attığını iddia ediyor. Belli bir Tweet benim için yanlış biçimlendirilmiş sözdizimine benzediği için dikkatimi çekti, bu yüzden daha yakından bakmaya karar verdim. Şimdiye kadar aşağıdaki kodu hazırladım:Haskell'de Emoji'yi Kullanma

module Main where 

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

main = print $ "♥" 

benim Haskell kodunda vesilesiyle λ kullandım beri, işe bu kodu beklenen, ancak GHC hiç emoji'yi sevmez anlaşılıyor . $ runhaskell Main.hs ile

alıyorum:

Main.hs: 4: 1: girdi ''

hatayı ayrıştırmak Zaten UnicodeSyntax uzantılı bir göz vardı ve denedim Belirli bir kişinin problemi provoke edip etmediğini görmek için hepsinin yerine sadece bir veya birkaç emoji kullanmak.

Şimdi benim sorum şu: Şu anda bu kodu kabul eden bir Haskell derleyicisi var mı? GHC'nin bu kodla bir şekilde çalışmasını sağlayabilir miyim?

+1

Bunu çok önemsediyseniz bilmiyorum ama bir önişlemci yapabilirsiniz. Afaik GHC, seçtiğiniz özel bir ön işlemciyi çalıştırmak için bir bayrağı vardır. – MasterMastic

+1

AFAIK, Unicode Sözdizimi '->' ile '' ', vb. Değiştirmenizi sağlar. Sadece kaynak kodunuzda Unicode karakterlerini kullanmak için * gerekli değildir *. https://downloads.haskell.org/~ghc/latest/docs/html/users_guide/syntax-extns.html#unicode-syntax – MathematicalOrchid

cevap

35

Bu kod geçerli değil haskell. sebebi (gibi muhtemelen tüm emoji'yi) sembolü karakteri olmasıdır:

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

Ama yine yani bir operatör olarak, başka herhangi bir sembol gibi kullanabilirsiniz:

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

Dahası, olarak Eğer yani operatörler için önek sözdizimini kullanın parantez içine koyun eğer user3237465, işaret, hatta başka sembol gibi kullanabilirsiniz:

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

main = print $() "♥" 

Bu orijinal sonrası neredeyse örnektir. Ne yazık ki, bu hile tür değişkeni için çalışmıyor. the documentation, maalesef biraz endişeli, ancak in fact sembolleri asla değişkenler değildir ve her zaman kurucuları yazmaktadır.

+1

Operatörler infix olmak zorunda değil, bu yasal: '() [] = Hiçbir şey;() ((): as) = ​​Sadece(); main = print $() "a" '. – user3237465

+0

Teşekkürler. Yanlışlıkla '()' ın, iki argümanı kabul eden bir işlev türüne sahip olmasını zorlayacağını, ancak bu sadece operatör bölümleri için geçerli olduğunu varsaydım. Hata [# 10772] (https://ghc.haskell.org/trac/ghc/ticket/10772) bunun tür düzeyinde çalışmadığı hakkında dosyaladı. –

+0

Ah, user3237465 ipucundan sonra güncellemeyi görmek çok güzel :) –