LINUX.ORG.RU

[haskell]Найти функцию по типу.

 


0

0

Можно ли в ghci(можно и не ghci, а что-то стороннее) найти функцию по типу? Гугл не ответил. Вроде find «Char -> Int» --> ord, ... Ещё, если можно заодно, найти функцию по имени и список всех функций в пакете. Заранее спасибо.



Последнее исправление: someone (всего исправлений: 1)

да, если пользуешься haskell-mode в емакс, то оно умеет сразу оттуда делать поиск

ott ★★★★★
()

Вопрос решен? Можно тогда и пару отвлеченных вопросов по топику.

Каким образом в хацкиле выполняется хвостовой вызов? В каких случаях вызов будет хвостовым, а в каких — нет?

balodja ★★★
()
Ответ на: комментарий от Ruga-Suneto

Учитывая что всё ленивое, как происходит выполнение?

Не всё. Паттерн-матчинг не ленивый (по умолчанию). Вот там-то редукции и происходят.

Miguel ★★★★★
()
Ответ на: комментарий от Miguel

в RWH вроде говорится упоминалось, что паттерн с аккумулирующим параметром применять не нужно из-за ленивости.

он просто лишний, или даже мешает?

anonymous
()
Ответ на: комментарий от anonymous

Ни фига не понял в вопросе. Начать уже с того, что я из RWH читал несколько глав, и не знаю, о каком месте ты говоришь.

Miguel ★★★★★
()
Ответ на: комментарий от Miguel

Похоже, что он о шаблоне проектирования: хвостовой вызов + аккумулятор через который передается состояние.

dave ★★★★★
()
Ответ на: комментарий от ott

А с помощью Hoogle можно делать подсказки для незаконченных выражений? Скажем, сделать REPL и выдавать тип для частично введенного выражения + подсказку, что можно вводить с учетом этого типа дальше.

Вообще, можно соорудить для Хаскеля REPL, подобный лисповому, и сделать инструмент, аналогичный SLIME?

anonymous
()
Ответ на: комментарий от anonymous

> А с помощью Hoogle можно делать подсказки для незаконченных выражений?

Если я тебя правильно понял, то в haskell-mode это есть.

Вообще, можно соорудить для Хаскеля REPL, подобный лисповому

ghci що-то умеет.

Ruga-Suneto
()
Ответ на: комментарий от Ruga-Suneto

Почитал про haskell-mode. Насколько я понял, inferior-haskell умеет определять расшифровки типов для алгебраических типов, функций и т.д. А мне хочется, чтобы пользователь мог ввести, к примеру, «map (\(x, y) -> x)» и появится подсказка, что дальше он может указать только список пар. Т.е. нужно определить тип незаконченного выражения.

А у какого-нибудь транслятора Хаскеля нет программного интерфейса к своим внутренностям? Захотелось заиспользовать его для работы с некоторыми типизированными внешними данными (например, в БД) так, чтобы пользователь не мог складывать яблоки с грушами и видел всякие подсказки на эту тему при вводе команд.

anonymous
()
Ответ на: комментарий от anonymous

нужно определить тип незаконченного выражения

а каким местом оно незаконченное?

Prelude> :t map (\(x, y) -> x)
map (\(x, y) -> x) :: [(t, t1)] -> [t]

А у какого-нибудь транслятора Хаскеля нет программного интерфейса к своим внутренностям?

какого рода интерфейс тебя интересует?

jtootf ★★★★★
()
Ответ на: комментарий от jtootf

Согласен, насчет незаконченности я погорячился. Но можно придумать и другой пример, скажем: [code] fun (x, y) = x + y

fun (5, ? [/code] вот предположим, что пользователь ввел что-то такое и курсор у него стоит вместо знака вопроса. Нужно выдать подсказку, чего он может вводить дальше, т.е. не только определить тип fun, но и выделить тип y.

Интерфейс интересует такой, чтобы можно было передавать транслятору законченные или нет выражения, а он бы их обрабатывал, выдавал их тип и, в случае законченности, присоединял бы их к образу программы. Ну и позволял сохранять/загружать образ. В общем, хочется CL с синтаксисом и системой типов Хаскеля. Цель - DSL для задач, неплохо описывающихся в терминах операций над множествами, строками, простейших математических и некоторых других, предназначенный для использования в режиме REPL.

anonymous
()
Ответ на: комментарий от anonymous

можно придумать и другой пример

а смысл? чем это существенно лучше проверки типа выражения отдельным вызовом :t?

выделить тип y

что-то такое, что ли:

Prelude> let f x y = x + y
Prelude> :t f 5
f 5 :: (Num t) => t -> t
Prelude> :t f 5.0
f 5.0 :: (Fractional t) => t -> t

если программист не понимает сам, с каким выражением он работает, толку ему от такой подсказки «по месту» будет ноль

Интерфейс интересует такой

посмотри на UHC, у него с выворачиванием кишок компилятора наружу проще всего. но вообще ты хочешь странного

В общем, хочется CL с синтаксисом и системой типов Хаскеля

так не бывает. лучшее существеющее приближение - Qi

jtootf ★★★★★
()
Ответ на: комментарий от jtootf

Смысл в том, что то, чего я хочу, предназначается не для программистов. И это не полноценный язык программирования, а язык описания действий над данными.

Плюс, при получении информации о типе того, что можно вводить в данный момент, можно предоставлять пользователю иные средства ввода, нежели текстовый (например, как в CLIM позволять щелкать по отображению объекта соответствующего типа).

В предыдущем сообщении у меня пример криво отобразился, повторяю:

fun (x, y) = x + y

fun (5, ?
вот вместо вопроса система скажет, чего тут можно ввести и предложит варианты ввода.

Думается, зря я Хаскель пытаюсь сюда припахать, для данной задачи он явно избыточен. Вполне можно этот DSL реализовать самостоятельно, самым сложным, наверное, будет вывод типов.

anonymous
()
Ответ на: комментарий от anonymous

Если ты читал RWH, то там все написано. При таком подходе (хвостовой вызов + аккумулятор) в общем случае создается много thunk'ов в памяти, что не есть путь хаскеля. В общем, прием плохо годится для ленивого языка. Хвостовая рекурсия сама по себе используется. Твой вопрос был в этом?

dave ★★★★★
()
Ответ на: комментарий от dave

я из книги не понял, как происходит оптимизация без использования аккумулятора. мой вопрос заключается в том, есть ли случаи, когда в хаскелле нужно применять аккумулятор.

anonymous
()
Ответ на: комментарий от anonymous

про хвостовую рекурсию в хаскеле мне так никто и не ответил

лично я твоего вопроса как не понимал, так и до сих пор не понимаю. кроме того, что ты путаешь язык и его реализацию (имеешь в виду, вероятно, GHC, но надеешься на телепатов) и не желаешь потратить 10 минут времени на ручную проверку профайлером, ты ещё и крайне сумбурно выражаешь свои мысли

jtootf ★★★★★
()
Ответ на: комментарий от anonymous

Да, есть. По-моему reverse написан в таком стиле.

dave ★★★★★
()
Ответ на: комментарий от jtootf

я понимаю, что оптимизация зависит от реализации. но в данном случае реализация не важна. я просто удивился, каким образом ленивость спасает от роста потребляемой памяти, при расчете рекурсивной задачи, которая при использовании аккумулятора, могла бы развернутся в цикл.

вот ты как пишешь? с аккумуляторам или без?

в строгих ф-х языках, независимо от реализации, принято использовать аккумулятор.

anonymous
()
Ответ на: комментарий от anonymous

> в строгих ф-х языках, независимо от реализации, принято использовать аккумулятор.

а хаскелл уже не строгий?

korvin_ ★★★★★
()
Ответ на: комментарий от anonymous

вот ты как пишешь?

с помощью бананов, линз и колючей проволоки. явно рекурсию не приходится писать почти никогда

jtootf ★★★★★
()
Ответ на: комментарий от jtootf

не приходится писать рекурсию явно? значит я не умею готовить хаскель. посоветуй книгу, где учат писать на хаскеле. а то я книги по написанию программ на других ф-х языках, и там рекурсия использовалась часто.

anonymous
()
Ответ на: комментарий от jtootf

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

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.