Haskell «Аргумент, не зависящий от типа, в ограничении»

Я создал список частично примененных функций в моем REPL следующим образом:

listOfPartiallyAppliedFunctions = map (*) [1..100]

Затем я хотел бы создать список результатов завершения приложения функции, что я могу легко сделать, предоставив лямбда-функция карты следующим образом:

let results = map (\x -> x 4) listOfPartiallyAppliedFunctions

Что в основном означает сопоставление примененной функции x с 4 по списку частично примененных функций, где x — каждая частично примененная функция из списка.

Однако я подумал, что из этого следует, что я мог бы написать:

let results = map (4) listOfPartiallyAppliedFunctions

Поскольку не должно быть необходимости предоставлять лямбду для функции карты, поскольку она должна знать, что нужно применить 4 к частично примененным функциям, содержащимся в listOfPartiallyAppliedFunctions.

Однако я получаю эту ошибку:

• Non type-variable argument in the constraint: Num ((a -> a) -> b)
  (Use FlexibleContexts to permit this)
• When checking the inferred type
    it :: forall a b. (Num a, Num ((a -> a) -> b), Enum a) => [b]

Может ли кто-нибудь помочь мне разобрать эту ошибку? Я думал, что 4 был экземпляром конструктора типа Num?

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
6
0
1 507
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

However, I thought it would then follow that I could write:

let results = map (4) listOfPartiallyAppliedFunctions

Нет, если бы вы исполнили \x -> 4 x, вы могли бы заменить его на 4. Но поскольку 4 означает, что это экземпляр Num, и вы, вероятно, не сделали функцию a -> b экземпляром Num, компилятор не может решить эту проблему. Таким образом, компилятор говорит, что он не находит способа преобразовать число 4 в функцию, и уж точно не в функцию, которая принимает на вход функцию Num a => a -> a, а затем преобразует ее в b.

Однако вы можете написать приведенное выше просто:

let results = map ($ 4) listOfPartiallyAppliedFunctions

Таким образом, здесь мы выполняем разделение инфиксного оператора [Haskell-wiki] для функции ($) :: (a -> b) -> a -> b.

Фантастический ответ, как всегда, Виллем - ценю это!

Thomas Cook 09.07.2019 16:58

А, это оператор приложения инфиксной функции? Я видел это повсюду, но никогда не понимал этого, так что это все равно, что сказать: «Применить функцию (то есть текущий элемент в моем списке частично примененных функций, которые я отображаю) к значению 4?

Thomas Cook 09.07.2019 16:59

@ThomasCook: разделение инфиксного оператора указывает, что ($ 4) эквивалентно \x -> ($) x 4, поскольку ($) реализовано как ($) f x = f x, таким образом, оно эквивалентно \x -> x 4

Willem Van Onsem 09.07.2019 17:48

Три «закона» операторных секций являются

(a `op` b)  =  (a `op`) b  =  (`op` b) a  =  op a b

(отсутствующий аргумент помещается в свободный слот рядом с оператором),

или с $,

a b  =  (a $ b)  =  (a $) b  =  ($ b) a  =  ($) a b

Таким образом

(\ x -> x 4) = (\ x -> x $ 4) = (\ x -> ($ 4) x)

и это, путем эта-редукции,

($ 4) 

Другие вопросы по теме