Haskell: Нет экземпляра для (Eq a), возникающего из-за использования `== '

Вероятно, лучший способ сделать это - использовать директиву setuptools package_data. Это означает использование setuptools (или distribute ) вместо distutils, но это очень плавное «обновление».

Вот полный (но непроверенный) пример:

from setuptools import setup, find_packages

setup(
    name='your_project_name',
    version='0.1',
    description='A description.',
    packages=find_packages(exclude=['ez_setup', 'tests', 'tests.*']),
    package_data={'': ['license.txt']},
    include_package_data=True,
    install_requires=[],
)

Обратите внимание на конкретные критические значения здесь:

package_data={'': ['license.txt']},
include_package_data=True,

package_data является dict имен пакетов ( empty = all packages) в список шаблонов (может включать в себя глобусы). Например, если вы хотите указывать только файлы внутри своего пакета, вы также можете это сделать:

package_data={'yourpackage': ['*.txt', 'path/to/resources/*.txt']}

Решение здесь, безусловно, , а не , чтобы переименовать ваш py ] с расширением .py.

Для получения дополнительной информации см. презентацию Ian Bicking .

UPDATE: другой [лучший] подход

Другой подход, который хорошо работает, если вы просто хотите контролировать содержимое исходного дистрибутива (sdist) и иметь файлы за пределами пакета (например, каталог верхнего уровня), - это добавить файл MANIFEST.in. См. документацию Python для формата этого файла.

С момента написания этого ответа я обнаружил, что использование MANIFEST.in, как правило, менее отвратительный подход, чтобы убедиться, что ваш источник дистрибутив (tar.gz) имеет нужные файлы.

Например, если вы хотите включить requirements.txt с верхнего уровня, рекурсивно включить каталог «данных» верхнего уровня:

include requirements.txt
recursive-include data *

Тем не менее, для того, чтобы эти файлы, которые будут скопированы во время установки в папку пакета внутри пакетов сайта, вам нужно будет предоставить include_package_data=True функции setup(). См. Добавление некодовых файлов для получения дополнительной информации.

17
задан Muhd 22 April 2013 в 18:57
поделиться

1 ответ

Вы сравниваете два элемента типа a, используя ==. Это означает, что a не может быть просто любым типом - это должен быть экземпляр Eq, так как тип == равен (==) :: Eq a => a -> a -> Bool.

Это можно исправить, добавив ограничение Eq в a к сигнатуре типа вашей функции:

isPalindrome :: Eq a => [a] -> Bool

Кстати, есть гораздо более простой способ реализации эта функция использует reverse.

31
ответ дан hammar 22 April 2013 в 18:57
поделиться
Другие вопросы по тегам:

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