LINUX.ORG.RU

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

P.S. Здесь можно было sum, зачем извращаться?

iVS ★★★★★
()
Последнее исправление: iVS (всего исправлений: 1)
summ [x, y] = x + y
summ (x:xs) = x + summ xs

Как-то так.

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

Видимо я просто не догадался что нельзя в хацкеле объявить 2 функции с одинаковыми именами но разным количеством аргументов. Это так?

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

Правило хорошего тона — прописывать сигнатуру ф-ции до реализации. При двух аргументах это

summ :: Double -> Double -> Double
При трех:
summ :: Double -> Double -> Double -> Double
Очевидно, что это разные ф-ции. Объединением является ф-ция над списком:
summ :: [Double] -> Double

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

На самом деле, такое можно сделать. Посмотри на исходники Text.Printf.

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

Видимо я просто не догадался что нельзя в хацкеле объявить 2 функции с одинаковыми именами но разным количеством аргументов. Это так?

Да, у каждой функции в Haskell ровно один аргумент.

Нельзя объявлять две переменные разных типов с одним именем. Так точнее.

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

Видимо я просто не догадался что нельзя в хацкеле объявить 2 функции с одинаковыми именами но разным количеством аргументов. Это так?

Да, у каждой функции может быть только один тип (сигнатура). Тем не менее читни про частичное применение и помедитируй над тем, что если есть

f w x y z = ...
то вполне законно использовать также
f
f w
f w x
f w x y

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

Частичное применение везде сейчас есть, нашел чем хвастаться. А проблема, насколько я понял, в том, что нельзя сделать как в нормальных языках

sum := method(call evalArgs reduce(+))
Покажи, как решить эту проблему, если можешь, а не занимайся демагогией.

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

Очевидно, что это разные ф-ции

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

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

и на Text.Printf.printf

В ML тоже есть Printf.printf, но он, вроде, реализован не без помощи препроцессора. Хаскелльный Text.Printf.printf реализован без помощи Template Haskell? Мне лень на него смотреть. =)

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

Text.Printf.printf

то есть, ты хочешь сказать, что хаскель настолько убог, что нельзя из Text.Printf.printf просто print?

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

Сделать функцию от произвольного количества аргументов конечно же можно, нужно всего-лишь немного typeclass магии, пример есть в сообщении выше, десятке тредов на лоре, и пятерке сообщений в maillist. С другой стороны в haskell все функции на самом деле с Arity 1 (или 0)[0], то понять что f x y это недопримененная функция от большего числа аргументов или полностью примененная от двух нельзя (если не выводится из контекта), так что придётся почти везде везде аннотировать типы, что явно не хочется.

[0] это утверждение следует уточнять, если рассматривать уровень stg, но тут это не важно.

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

я не понимаю, что значит «сделать из Text.Print.printf print». Так что поясни, если хочешь услышать ответа.

Как я уже писал «полиморфные по количеству аргументов» функции в Haskell сделать можно, но я не вижу ни одной причины, по которой это нужно, во всяком случае в таком языке как haskell. Так же я не вижу, чем подобные функции как они работают в lisp отличаются от (немного нечестный синтаксис) f :: [forall a . SomeTypeclass a => a] -> B, те же много аргументов, тоже сразу выполнится.

Вообще предложения сделать возможность разного количества аргументов если аргументы являются моноидом относительно функции от хацелелисперов типа Криса Дона уже были, но вроде ничем не кончилось.

qnikst ★★★★★
()
Последнее исправление: qnikst (всего исправлений: 1)
Ответ на: комментарий от qnikst

Так что поясни, если хочешь услышать ответа.

Ясно что. Что-нибудь типа такого

print = Text.Print.printf
print("my text")

anonymous
()
Ответ на: комментарий от anonymous
qnikst@qwork ~ $ ghci
GHCi, version 7.10.1: http://www.haskell.org/ghc/  :? for help
Prelude> :m Text.Printf 
Prelude Text.Printf> let print = printf
Prelude Text.Printf> print "my text\n"
my text

так?

qnikst ★★★★★
()
Ответ на: комментарий от qnikst
qnikst@qwork ~ $ ghci
GHCi, version 7.10.1: http://www.haskell.org/ghc/  :? for help
Prelude> let print = Text.Printf.printf

Prelude> print "my text\n"
my text

так

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

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

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