2016-08-08 1 views
1

Я хочу создать псевдонимы Unicode для некоторых стандартных функций в библиотеке Haskell. Вот моя попытка.Как создать псевдоним для функции с использованием символов Unicode в Haskell

{-# LANGUAGE UnicodeSyntax #-} 
{-# LANGUAGE NoMonomorphismRestriction #-} 

import qualified Data.List as List 
import qualified Data.Map as Map 
import qualified Data.Set as Set 


-- Convenient aliases for common operations via Unicode symbols. 
∩ = Set.intersection 
∪ = Set.union 
⊆ = Set.isSubsetOf 
⊊ = Set.isProperSubsetOf 
∈ = Set.member 

main = putStrLn "Hello World!" 

Когда я пытаюсь скомпилировать это, я получаю ошибку

[~/Desktop]$ ghc --make test.hs 
[1 of 1] Compiling Main    (test.hs, test.o) 

test.hs:10:1: parse error on input ‘∩’ 
[~/Desktop]$ 

Я хочу использовать эти символы Юникода как операторы инфиксных, и, надеюсь, без кавычки. Как это сделать?

+3

[Есть библиотека для этого] (https://hackage.haskell.org/package/containers-unicode-symbols-0.3.1.1/docs/Data-Set-Unicode.html);) – MarLinn

+0

@ MarLinn Wow! Спасибо! – smilingbuddha

ответ

5

Вы должны окружить свои новые функции с скобками при объявлении их:

(∩) = Set.intersection 

Обратите внимание, что вам также необходимо удалить заглавные буквы из функции импортируемой из Data.Set, потому что Set.Intersection рассматривается как конструктор данных а не как функция (и фактически не существует).

6

Так же, как при определении любого другого оператора инфикс точки бесплатно, вам нужно обернуть оператор в скобках в точке его определения:

(∩) = Set.intersection 
(∪) = Set.union 
(⊆) = Set.isSubsetOf 
(⊊) = Set.isProperSubsetOf 
(∈) = Set.member 

Поскольку эти символы все классифицированы как символы, они рассматриваются как инфиксные операторы, с UnicodeSyntax или без них (это просто позволяет некоторым символам юникода в местах, зарезервированных как синтаксис языка, например ::).

+0

Как показывает другой ответ, капитализация также неверна. – dfeuer