#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>