Я не понимаю, почему следующее упражнение «работает» в Haskell программирования из первых принципов:Частичное применение конструктора данных
type Subject = String
type Verb = String
type Object = String
data Sentence =
Sentence Subject Verb Object
deriving (Eq, Show)
s1 = Sentence "dogs" "drool"
s2 = Sentence "Julie" "loves" "dogs"
Загрузка это в GHCI показывает, что typechecks просто отлично, но почему что определение s1
даже имеет смысл? Я все еще очень новичок в Haskell, поэтому сначала я подумал, что это произошло потому, что в s1
Haskell неявно допускал пустую строку Object
. Но тогда ...
*Main> s1
<interactive>:13:1:
No instance for (Show (Object -> Sentence))
arising from a use of `print'
Possible fix:
add an instance declaration for (Show (Object -> Sentence))
In a stmt of an interactive GHCi command: print it
Я все еще учась правильно интерпретировать эти сообщения об ошибках, поэтому, пожалуйста, несите меня. Но может ли кто-нибудь объяснить, что означает No instance for (Show (Object -> Sentence))
? В частности, как это делает вывод Object
строки в s1
? (Object -> Sentence)
вещь?
Я уверен, что это глупо легко, но я не думаю, что книга оборудовал мне понять это по этому вопросу ...
Посмотрите функцию Карринг и иметь в виду что конструкторы данных, такие как «Sentence», рассматриваются как обычные функции. – Alec