Как дела универсальное программирование в Haskell?

Если выходные данные проверки str.contains получают пропущенные значения для числовых значений:

print(df.col1.str.contains("C"))
0      NaN
1      NaN
2     True
3    False
4      NaN
5      NaN
Name: col1, dtype: object

Решением является использование параметра na - str.contains и инвертирование логической маски с помощью [115 ]:

print(df[~df.col1.str.contains("C", na=False)])
     col1  col2
0       1     3
1       2     4
3  A56665     4
4   34553     3
5  353535     4

Подробности :

print(df.col1.str.contains("C", na=False))
0    False
1    False
2     True
3    False
4    False
5    False
Name: col1, dtype: bool

print(~df.col1.str.contains("C", na=False))
0     True
1     True
2    False
3     True
4     True
5     True
Name: col1, dtype: bool

9
задан obecalp 18 December 2008 в 08:10
поделиться

5 ответов

Это тесно связано с Вашим другим вопросом о Haskell и quicksort. Я думаю, что, вероятно, необходимо считать, по крайней мере, введение книги о Haskell. Кажется будто Вы еще не схватили ключевой пункт об этом, который является, что это запрещает Вам изменить значения существующих переменных.

Подкачка (как понято и используется в C++), по его самому характеру, всем об изменении существующих значений. Это так, мы можем использовать имя для обращения к контейнеру и замене, что контейнер с совершенно другим содержанием, и специализирует ту операцию, чтобы быть быстрым (и без исключений) для определенных контейнеров, позволяя нам реализовать подход изменять-и-публиковать (крайне важный для написания безопасного от исключения кода или попытки написать свободный от блокировок код).

Можно записать универсальную подкачку в Haskell, но она, вероятно, взяла бы пару значений и возвратила бы новую пару, содержащую те же значения с их положениями, инвертированными, или что-то как этот. Едва ли то же самое и не наличие того же использования. Не имело бы никакого смысла пытаться специализировать его для карты путем рытья в той карте и свопинга ее отдельных членских переменных, потому что Вам просто не разрешают сделать подобные вещи в Haskell (можно сделать специализацию, но не изменение переменных).

Предположим, что мы хотели "измерить" список в Haskell:

measure :: [a] -> Integer

Это - описание типа. Это означает что функция measure берет список чего-либо (a универсальный параметр типа, потому что он запускается со строчной буквы), и возвращает Целое число. Таким образом, это работает на список любого типа элемента - это - то, что назвали бы шаблоном функции в C++ или полиморфной функцией в Haskell (не то же как полиморфный класс в C++).

Мы можем теперь определить это путем обеспечения специализаций для каждого интересного случая:

measure [] = 0

т.е. измерьте пустой список, и Вы получаете нуль.

Вот очень общее определение, которое касается всех других случаев:

measure (h:r) = 1 + measure r

Бит в круглых скобках на LHS является шаблоном. Это означает: возьмите список, прервите голову и назовите ее h, назовите остающуюся часть r. Те имена являются затем параметрами, которые мы можем использовать. Это будет соответствовать любому списку по крайней мере одному объекту на нем.

При попытке шаблонного метапрограммирования в C++, это все будет старой шляпой Вам, потому что это включает точно тот же стиль - рекурсия, чтобы сделать циклы, специализация для создания рекурсии оконечной. За исключением того, что в Haskell это работает во времени выполнения (специализация функции для конкретных значений или шаблонов значений).

30
ответ дан 4 December 2019 в 06:00
поделиться

Как Earwicker Саис, пример не так значим в Haskell. Если Вы абсолютно хотите иметь его так или иначе, вот что-то подобное (свопинг двух частей пары), c&p от интерактивной сессии:

GHCi, version 6.8.2: http://www.haskell.org/ghc/  :? for help
Loading package base ... linking ... done.
Prelude> let swap (a,b) = (b,a)
Prelude> swap("hello", "world")
("world","hello")
Prelude> swap(1,2)
(2,1)
Prelude> swap("hello",2)
(2,"hello")
9
ответ дан 4 December 2019 в 06:00
поделиться

После чтения достаточно в книге Haskell для реального понимания ответа Earwicker я предположил бы, что Вы также читаете о классах типа. Я не уверен, что “означает частичная специализация”, но она кажется, что они могли приблизиться.

2
ответ дан 4 December 2019 в 06:00
поделиться

В Haskell функции максимально универсальны (полиморфный) - компилятор выведет "Самый общий тип". Например, подкачка TheMarko в качестве примера является полиморфной по умолчанию в отсутствие подписи типа:

*Основной> позволяют подкачке (a, b) = (b, a)
*Основной>: t подкачка
подкачка:: (t, t1)-> (t1, t)

Что касается частичной специализации, ghc имеет не98 расширений:
file:///C:/ghc/ghc-6.10.1/doc/users_guide/pragmas.html#specialize-pragma

Кроме того, обратите внимание, что существует несоответствие в терминологии. Что назвало универсальным в C++, Java, и C# называют полиморфным в Haskell. "Универсальный" в Haskell обычно означает polytypic: http://haskell.readscheme.org/generic.html
Но, aboe я использую значение C++ дженерика.

6
ответ дан 4 December 2019 в 06:00
поделиться

В Haskell вы создадите классы типов . Классы типов не похожи на классы в объектно-ориентированных языках. Возьмем класс типа Numeric. В нем говорится, что все, что является экземпляром класса, может выполнять определенные операции (+ - * /), поэтому Integer является членом Numeric и предоставляет реализации функций, необходимых для того, чтобы считаться Numeric, и может использоваться где угодно. Ожидается числовой.

Допустим, вы хотите иметь возможность работать с интсами и строками. Затем вы должны объявить Int и String как экземпляры типа class Foo. Теперь везде, где вы видите тип (Foo a), вы можете использовать Int или String.

Причина, по которой вы не можете добавлять целые числа и числа с плавающей запятой напрямую, заключается в том, что add имеет тип (Numeric a) a -> a -> aa является переменной типа и, как и обычные переменные, может быть привязан только один раз, поэтому как только поскольку вы привязываете его к Int, каждый a в списке должен быть Int.

5
ответ дан 4 December 2019 в 06:00
поделиться
Другие вопросы по тегам:

Похожие вопросы: