Сетевой модуль не найден

#haskell #networking #module

#haskell #сеть #модуль

Вопрос:

Я новичок в haskell, поэтому прошу прощения за отсутствие knoledge

Я пытаюсь создать TCP-сервер и использую сетевой модуль

 import Network (listenOn, withSocketsDo, accept, PortID(..), Socket)
  

Во время компиляции я получаю сообщение об ошибке, что сетевой модуль не найден, cabal, похоже, не находит сетевой модуль и ghc-pkg list ничего не показывает

Ответ №1:

Используйте hoogle для поиска нужных вам функций. Похоже, вы, вероятно, ищете network пакет, который экспортирует несколько разных модулей (например, Network.Socket )

Название пакета и названия модулей — это совершенно разные вещи. Несколько пакетов могут экспортировать одно и то же имя модуля. Как правило, имя пакета никогда не появляется в вашем коде на haskell (хотя есть расширение для импорта с учетом требований пакета)

Ответ №2:

Немного терминологии: То, что вы устанавливаете с cabal, является «пакетом». То, что вы импортируете в коде, является «модулем».

Я пытаюсь создать TCP-сервер и использую сетевой модуль

Ни в одном современном пакете Haskell, о котором я знаю, нет «сетевого» модуля. Это было бы вашей первой проблемой.

импортируйте сеть (listenOn, withSocketsDo, accept, portId (..), сокет)

Если вы новичок и узнали об этом модуле и функциях из ресурса, тогда найдите что-нибудь новое — два года назад сетевой пакет изменился и больше не экспортирует «Сеть» как модуль.

похоже, cabal не находит сетевой модуль

Снова cabal устанавливает пакеты, так что вы, вероятно, имеете в виду сетевой пакет. Cabal действительно знает об этом пакете:

 bash-3.2$ cabal update 2>/dev/null 1>amp;2 amp;amp; cabal info network
* network          (library)
    Synopsis:      Low-level networking interface
...
  

и список ghc-pkg ничего не показывает

ghc-pkg действительно низкоуровневый и откровенно недостаточный в наши дни. Он не обрабатывает среды пакетов, используемые в новых GHC. Вы можете, например, настроить .ghc.environment и использовать библиотеки, перечисленные там, без того, чтобы ghc-pkg когда-либо сообщал вам, что эти пакеты установлены.

Например, ниже я устанавливаю network и прошу cabal записать файл среды ghc, затем прошу ghc-pkg указать сетевой пакет (не указан), затем использую сетевой пакет в GHCi (GHCi знает, что нужно прочитать файл среды).

 tommd@ovdak /tmp% cabal install --package-env . --lib network
Resolving dependencies...
Up to date
cabal install --package-env . --lib network  2.60s user 0.49s system 95% cpu 3.254 total
tommd@ovdak /tmp% ghc-pkg list network
/Users/tommd/.ghcup/ghc/8.10.1/lib/ghc-8.10.1/package.conf.d
    (no packages)
tommd@ovdak /tmp% ghci
GHCi, version 8.10.1: https://www.haskell.org/ghc/  :? for help
Loaded package environment from /private/tmp/.ghc.environment.x86_64-darwin-8.10.1
package flags have changed, resetting and loading new packages...
Loaded GHCi configuration from /Users/tommd/.ghci
Prelude> import Network.Socket
Prelude Network.Socket>