Форум программистов, компьютерный форум, киберфорум
Haskell
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 5.00/25: Рейтинг темы: голосов - 25, средняя оценка - 5.00
 Аватар для Iriska-kiska
89 / 10 / 0
Регистрация: 28.11.2011
Сообщений: 21

Функция min4, по четырём вещественным возвращающая наименьшее из них

09.04.2012, 14:20. Показов 5189. Ответов 36
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Дорогие мои!
Помогите пожалуйста!!!
Определите функцию: функция min4, по четырём вещественным возвращающая наименьшее из них.
Ну не как не могу сделать это задание.
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
09.04.2012, 14:20
Ответы с готовыми решениями:

Функция, принимающая три числа, и возвращающая среднее из них
функция на вход принимает три числа должен вернуть среднее среди них например, среди 7, 2, 35 - средним будет 7. Как решить такое?

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

Функция, принимающая 2 массива и возвращающая ассоциативный массив, составленный из них
Помогите пожалуйста, буду очень благодарен. На языке PHP реализовать функцию, которая в качестве параметров принимает два массива: $M и...

36
Эксперт С++
 Аватар для Nameless One
5828 / 3479 / 358
Регистрация: 08.02.2010
Сообщений: 7,448
11.04.2012, 08:21
Лучший ответ Сообщение было отмечено как решение

Решение

Студворк — интернет-сервис помощи студентам
bokunopico, никакого математического аппарата, просто последовательно вручную применял определение композиции (в уме вряд ли получится для числа параметров, большего двух), преобразовывая выражение функции к эквивалентному и удаляя параметры справа.

Для определения #2:

Haskell
1
2
3
4
5
6
7
8
9
10
11
--min4 a b c d = min (min (min a b) c) d -- удаляем d
--min4 a b c = min (min (min a b) c) -- применяем правило композиции для c
--min4 a b c = (min . (min (min a b))) c -- удаляем c
--min4 a b = min . (min (min a b)) -- композиция для b
--min4 a b = min . ((min . (min a)) b) -- (a . b) == ((.) a b) (префиксная запись инфиксного оператора)
--min4 a b = (.) min ((min . (min a)) b) -- композиция для b; меняем префиксную запись оператора (.) на инфиксную
--min4 a b = ((min .) . ((min . (min a)))) b --удаляем b
--min4 a = (min .) . (min . (min a)) -- меняем инфиксную запись на префиксную; композиция для a
--min4 a = (.) (min .) ((((.) min) . (min)) a) -- композиция для a
--min4 a = (((.) (min .)) . (((.) min) . (min))) a -- удаляем a; меняем префиксную запись на инфиксную
min4 = ((min .) .) . (min .) . min -- окончательная запись
Для определения #1 посложнее:

Haskell
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
min4 :: Double -> Double -> Double -> Double -> Double
--min4 a b c d = min a (min b (min c d))
--min4 a b c d = min a (((min b) . (min c)) d)
--min4 a b c d = ((min a) . ((min b) . (min c))) d
--min4 a b c = (min a) . ((min b) . (min c))
--min4 a b  = ((.) (min a)) . ((((.) . min) b) . min)
--min4 a b  = ((.) (min a)) . ((. min) (((.) . min) b))
--min4 a b  = (.) ((.) (min a)) ((. min) (((.) . min) b))
--min4 a b  = (.) ((.) (min a)) (((. min) . ((.) . min)) b)
--min4 a = (.) ((.) (min a)) . ((. min) . (.) . min)
--min4 a = flip (.) ((. min) . (.) . min) ((.) ((.) (min a))) -- (flip (.) a) == (. a)
--min4 a = (. (. min) . (.) . min) ((.) ((.) (min a)))
--min4 a = (. (. min) . (.) . min) ((.) (((.) . min) a))
--min4 a = (. (. min) . (.) . min) (((.) . (((.) . min))) a)
--min4 = (. (. min) . (.) . min) . (((.) . (((.) . min))))
--min4 = (. (. min) . (.) . min) . ((.) . (((.) . min)))
--min4 = (. (. min) . (.) . min) . ((.) . ((.) . min))
min4 = (. (. min) . (.) . min) . (.) . (.) . min -- окончательная запись
Цитата Сообщение от 9Символов Посмотреть сообщение
А почему он называется безточечным?
http://www.haskell.org/haskellwiki/Pointfree

A common misconception is that the 'points' of pointfree style are the (.) operator (function composition, as an ASCII symbol), which uses the same identifier as the decimal point. This is wrong. The term originated in topology, a branch of mathematics which works with spaces composed of points, and functions between those spaces. So a 'points-free' definition of a function is one which does not explicitly mention the points (values) of the space on which the function acts. In Haskell, our 'space' is some type, and 'points' are values. In the declaration
Haskell
1
f x = x + 1
we define the function f in terms of its action on an arbitrary point x. Contrast this with the points-free version:
Haskell
1
f = (+ 1)
where there is no mention of the value on which the function is acting.
3
 Аватар для 9Символов
7 / 7 / 0
Регистрация: 25.03.2012
Сообщений: 72
11.04.2012, 08:26
Nameless One, Опа! Нашёл в википедии: по-русски это комбинаторное программирование.
0
Эксперт С++
 Аватар для Nameless One
5828 / 3479 / 358
Регистрация: 08.02.2010
Сообщений: 7,448
11.04.2012, 08:30
9Символов, термин «безточечный» в применении к Хаскелю распространен больше.
0
 Аватар для Buckminster
1032 / 703 / 66
Регистрация: 30.01.2012
Сообщений: 714
11.04.2012, 16:00
Цитата Сообщение от 9Символов Посмотреть сообщение
А почему он называется безточечным?
данные – это точки в топологическом пространстве, над которым производятся преобразования (функции)...
нет данных – нет точек...

Цитата Сообщение от Nameless One Посмотреть сообщение
термин «безточечный» в применении к Хаскелю распространен больше
м-да, особенно тонко в этом смысле звучит выражение "pointless Haskell"

Цитата Сообщение от Nameless One Посмотреть сообщение
никакого математического аппарата, просто последовательно вручную применял определение композиции [..], преобразовывая выражение функции к эквивалентному и удаляя параметры справа
тогда уж можно пойти ещё дальше, и удалить и
функции
Haskell
1
2
3
4
5
6
7
8
9
10
--min3 a b c = min (min a b) c 
--min3 = (.) ((.) min) min
 
--dd f g = (.) ((.) f) g
dd = (.).(.)
 
min3 = dd min min
 
> min3 2 1 3
1


или даже
так
Haskell
1
2
3
4
5
6
7
8
--dd = (.)(.)(.)
d = (.)
dd = d d d 
 
> dd min min 2 1 3
1
> dd (+) (*) 2 2 2
6


правда, для большего числа аргументов уже не так
изящно
Haskell
1
2
3
4
5
6
7
8
--min4 = ((min .) .) . (min .) . min
--ddd f g h = ((f .) .) . (g .) . h
ddd = d (flip d d) (d (d d) ((d d) (d d d)))
 
> ddd min min min 2 3 1 4
1
> ddd (+) (-) (^) 2 3 1 4
11
2
Эксперт С++
 Аватар для Nameless One
5828 / 3479 / 358
Регистрация: 08.02.2010
Сообщений: 7,448
11.04.2012, 16:08
Buckminster, поздравляю, ты придумал еще один комбинатор
0
 Аватар для Buckminster
1032 / 703 / 66
Регистрация: 30.01.2012
Сообщений: 714
11.04.2012, 16:52

Не по теме:

Цитата Сообщение от Nameless One Посмотреть сообщение
Buckminster, поздравляю, ты придумал еще один комбинатор :D
подумаешь! 8-)



в общем, предлагаю считать окончательным следующий весьма естественный вариант:
Haskell
1
2
3
4
5
6
7
min4 :: Ord a => a -> a -> a -> a -> a
min4 = ((.(.)).((.)(.).((.).((.).(.))))) min min min
 
--или просто:
> ((.(.)).((.)(.).((.).((.).(.))))) min min min 2 1 3 4
1
--по-моему, очень симпатично :)
0
 Аватар для 9Символов
7 / 7 / 0
Регистрация: 25.03.2012
Сообщений: 72
11.04.2012, 19:28
Насчёт безточечного определения.
ВОт есть например:
Haskell
1
2
f = sqrt
g a b c= a+b+c
Хотим привести функцию к безточечному стилю.
Ну начали:
Haskell
1
2
3
k a b c = f (g a b c) --начальная функция
k a b = f . (g a b) --отбросил с
k a b = (f . g a b) --застрял, так как вроде-бы не к чему тут композицию применить
Возможно ли её дальше с помощью "." преобразовать? И если да, то как?

p.s. До этого определения дошёл методом тыка.
0
 Аватар для Buckminster
1032 / 703 / 66
Регистрация: 30.01.2012
Сообщений: 714
12.04.2012, 13:18
Цитата Сообщение от 9Символов Посмотреть сообщение
Возможно ли её дальше с помощью "." преобразовать?
Haskell
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
f = sqrt
g a b c= a+b+c
 
--k a b c = f (g a b c)
--k a b c = f ((g a b) c)
--k a b c = (f . (g a b)) c
 
--k a b = f . (g a b)
--k a b = (f .) ((g a) b)
--k a b = ((f .) . (g a)) b
 
--k a = (f .) . (g a)
--k a = ((f .) .) (g a)
--k a = (((f .) .) . g) a
 
k = ((f .) .) . g
app
и традиционно уже избавимся также и от функций:
Haskell
1
2
3
4
5
6
7
8
9
--k = ((f .) .) . g
--k' f g = ((f .) .) . g
--k' f = (((f .) .) .)
--k' f = ((((.) f) .) .)
--k' f = (((.) ((.) f)) .)
--k' f = (.) ((.) ((.) f))
--k' f = (.) (((.).(.)) f)
--k' f = ((.).((.).(.))) f
k' = (.).((.).(.))
или через комбинатор d:
Haskell
1
2
3
4
d = (.)
 
--k' = (.) (.) ((.) (.) (.))
k' = d d (d d d)
в итоге получаем:
Haskell
1
2
> d d (d d d) f g 2 3 4
3.0
всё это, с одной стороны, довольно забавно, но чтобы тут во всём хорошенько разобраться, нужны, конечно же, глубокие самостоятельные исследования (пора бы мне уже и самому прочитать пару книжек по Haskell, а то на голом энтузязизьме далеко не уедешь)... вот ещё одна статья про комбинаторы: Комбинаторы — это просто! (2006)
2
 Аватар для 9Символов
7 / 7 / 0
Регистрация: 25.03.2012
Сообщений: 72
14.04.2012, 11:41
Пытался сделать более обобщённый комбиатор: вводишь ему цифру -- кол-во переменных у "2-ой" функции, от которой берётся первая ф-я от 1-й переменной. Ну из ваших выкладо, очевидно:
Haskell
1
2
 (( . ) . ( . )) -- комбинатор для ф-ий 1 и 2 переменных.
(( . ) . ( . ) . ( . )) -- для 1 и 3х переменных
Напрашивается обобщение:
Haskell
1
(\n->foldl1 (.) (replicate n (.)))
Но не получается.
Haskell
1
2
3
4
5
6
7
8
9
10
11
12
13
<interactive>:1:31:
    Occurs check: cannot construct the infinite type: c0 = a0 -> c0
    Expected type: (b0 -> c0) -> b0 -> c0
      Actual type: (b0 -> c0) -> (a0 -> b0) -> a0 -> c0
    In the second argument of `replicate', namely `(.)'
    In the second argument of `foldl1', namely `(replicate n (.))'
 
<interactive>:1:31:
    Occurs check: cannot construct the infinite type: b0 = a0 -> b0
    Expected type: (b0 -> c0) -> b0 -> c0
      Actual type: (b0 -> c0) -> (a0 -> b0) -> a0 -> c0
    In the second argument of `replicate', namely `(.)'
    In the second argument of `foldl1', namely `(replicate n (.))'
И я, честно-говоря, не знаю, как ему скормить что-то подобное.

Не по теме:

И это... как вы так код "прячете"?

0
 Аватар для Buckminster
1032 / 703 / 66
Регистрация: 30.01.2012
Сообщений: 714
14.04.2012, 14:32
off
Цитата Сообщение от 9Символов Посмотреть сообщение
как вы так код "прячете"?
кнопка CUT на панели инструментов (п.4)


Цитата Сообщение от 9Символов Посмотреть сообщение
Occurs check: cannot construct the infinite type
а каков будет тип полученной функции? интерпретатор должен это знать наверняка... а в данной ситуации тип не определён...

собственно, по ошибке:
types
Haskell
1
2
3
4
5
6
7
8
> :t foldl1
foldl1 :: (a -> a -> a) -> [a] -> a
 
> :t (.)
(.) :: (b -> c) -> (a -> b) -> a -> c
 
> :t replicate 2 (.)
replicate 2 (.) :: [(b -> c) -> (a -> b) -> a -> c]

т.е., функция foldl1 требует на входе функцию вида
(a -> a -> a)
а получает
(.) :: (b -> c) -> (a -> b) -> a -> c
в то время как согласно типу элементов списка должна получать
((b -> c) -> (a -> b) -> a -> c) -> ((b -> c) -> (a -> b) -> a -> c) -> ((b -> c) -> (a -> b) -> a -> c)

тогда уж лучше использовать этот подход (возвращается либо число, либо функция – по аналогии с printf)...
или, опять же, Template Haskell – он вроде как позволяет формировать код "на лету"...

why
очень знакомая ситуация...
Surely You're Joking, Mr. Feynman!
Цитата Сообщение от Вы, конечно, шутите, мистер Фейнман!
...А что касается мистера Френкеля, который затеял всю эту деятельность, то он начал страдать от компьютерной болезни - о ней сегодня знает каждый, кто работал с компьютерами. Это очень серьезная болезнь, и работать при ней невозможно. Беда с компьютерами состоит в том, что ты с ними играешь. Они так прекрасны, столько возможностей - если четное число, делаешь это, если нечетное, делаешь то, и очень скоро на одной-единственной машине можно делать все более и более изощренные вещи, если только ты достаточно умен.

Через некоторое время вся система развалилась. Френкель не обращал на нее никакого внимания, он больше никем не руководил. Система действовала очень-очень медленно, а он в это время сидел в комнате, прикидывая, как бы заставить один из табуляторов автоматически печатать арктангенс x. Потом табулятор включался, печатал колонки, потом - бац, бац, бац - вычислял арктангенс автоматически путем интегрирования и составлял всю таблицу за одну операцию.

Абсолютно бесполезное занятие. Ведь у нас уже были таблицы арктангенсов. Но если вы когда-нибудь работали с компьютерами, вы понимаете, что это за болезнь - восхищение от возможности увидеть, как много можно сделать. Френкель подцепил эту болезнь впервые, бедный парень; бедный парень, который изобрел всю эту штуку.
1
 Аватар для 9Символов
7 / 7 / 0
Регистрация: 25.03.2012
Сообщений: 72
14.04.2012, 14:39
Цитата Сообщение от Buckminster Посмотреть сообщение
функция foldl1 требует на входе функцию вида
(a -> a -> a)
а получает
(.) :: (b -> c) -> (a -> b) -> a -> c
в то время как согласно типу элементов списка должна получать
Хм... то-есть вы хотите сказать, что ( . ) не применима в foldr1?
Но ведь это работает:
Haskell
1
2
Prelude> foldl1 ( . ) [sqrt, (+2)] 1
1.7320508075688772
0
 Аватар для Buckminster
1032 / 703 / 66
Регистрация: 30.01.2012
Сообщений: 714
14.04.2012, 14:46
Цитата Сообщение от 9Символов Посмотреть сообщение
Но ведь это работае
тип функции, подаваемой на вход foldl1, должен соответствовать типу элементов списка... здесь всё в порядке:
Haskell
1
2
3
4
5
6
7
8
9
10
11
12
13
14
> :t sqrt
sqrt :: Floating a => a -> a
 
> :t (+2)
(+2) :: Num a => a -> a
 
> :t [sqrt, (+2)]
[sqrt, (+2)] :: Floating a => [a -> a]
 
> :t (.)
(.) :: (b -> c) -> (a -> b) -> a -> c
 
> :t foldl1 (.) [sqrt, (+2)]
foldl1 (.) [sqrt, (+2)] :: Floating c => c -> c
1
 Аватар для 9Символов
7 / 7 / 0
Регистрация: 25.03.2012
Сообщений: 72
14.04.2012, 15:01
Но здесь-то, например точка посредине ведёт себя таким образом:
Haskell
1
(( . ) . ( . ))
то есть берёт 2 комбинатора одного типа, возвращает 3-ий того-же типа.
А в foldr1 почему она подобно себя не ведёт? Может всё-таки версия про то, что надо исп. template haskell вернее? Ведь если бы просто тип не соответствовал, он бы так и писал, то ожидается одно, а на деле ему дают другое.
0
 Аватар для Buckminster
1032 / 703 / 66
Регистрация: 30.01.2012
Сообщений: 714
14.04.2012, 15:07
Цитата Сообщение от 9Символов Посмотреть сообщение
Но здесь-то, например точка посредине ведёт себя таким образом: [...] берёт 2 комбинатора одного типа, возвращает 3-ий того-же типа
не совсем, типы не совпадают:
Haskell
1
2
3
4
5
> :t (.)
(.) :: (b -> c) -> (a -> b) -> a -> c
 
> :t (.).(.)
(.).(.) :: (b -> c) -> (a -> a1 -> b) -> a -> a1 -> c
Цитата Сообщение от 9Символов Посмотреть сообщение
если бы просто тип не соответствовал, он бы так и писал, то ожидается одно, а на деле ему дают другое
собственно, он так и пишет:
Haskell
1
2
3
    Occurs check: cannot construct the infinite type: c0 = a0 -> c0
    Expected type: (b0 -> c0) -> b0 -> c0
      Actual type: (b0 -> c0) -> (a0 -> b0) -> a0 -> c0
т.е. нужен c0, а получает c0 = a0 -> c0, отсюда зацикливание и бесконечный тип (infinite type)...
1
 Аватар для 9Символов
7 / 7 / 0
Регистрация: 25.03.2012
Сообщений: 72
14.04.2012, 15:10
Цитата Сообщение от Buckminster Посмотреть сообщение
не совсем, типы не совпадают:
Haskell
1
2
3
4
5
> :t (.)
(.) :: (b -> c) -> (a -> b) -> a -> c
 
> :t (.).(.)
(.).(.) :: (b -> c) -> (a -> a1 -> b) -> a -> a1 -> c
И вправду, сморозил фигню.
0
 Аватар для Iriska-kiska
89 / 10 / 0
Регистрация: 28.11.2011
Сообщений: 21
04.05.2012, 15:32  [ТС]
Друзья, а как это все осуществить в компиляторе GHCi?
Вместо ответа одни ошибки.
0
Эксперт С++
 Аватар для Nameless One
5828 / 3479 / 358
Регистрация: 08.02.2010
Сообщений: 7,448
04.05.2012, 15:33
Iriska-kiska, либо использовать let перед определением функции, либо записывать определение функции в файл и делать
Code
1
:load файл
в GHCi
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
04.05.2012, 15:33

Функция возвращающая массив
#include &lt;iostream&gt; #include &quot;conio.h&quot; int *convertToBin() { int a = { 1, 2, 3, 4, 5}; return a; } int...

Функция, возвращающая массив
Возможно ли что функция возвращает массив. Если да то было бы хорошо листинг программы где выполняется такая реализация Спасибо!

Функция, возвращающая массив
Нужно вернуть из функции массив. int F(int a,int* b) { for(int i=0;i&lt;a;i++) *b++; for(int i=0;i&lt;3;i++)...

Функция, возвращающая константу
Почему добавление спецификатора const ничего не меняет? const int f(int a) { return a; } int main(int argc, char *argv)...

Функция, возвращающая указатель
Здравствуйте. Пускай есть класс Some_type и массив такого класса. Можно ли функцией Some_type* some_name (some_type) заполнять массив,...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
37
Ответ Создать тему
Новые блоги и статьи
Лето уходит
kumehtar 17.08.2026
Мысли в слух
kumehtar 17.08.2026
Забавно, насколько сейчас стала доступна информация. Например о магии, духовном развитии, медитациях, и других подобных направлениях, ранее зачастую тайных, передаваемых от учителя к ученику. Хотя. . .
Перемещение строк из ТЧ в другой документ с учетом текущего пробега
Maks 17.08.2026
Реализация из решения ниже выполнена на примере нетипового документа "Автозапчасти", с ТЧ "Шины". За основу взят алгоритм отсюда: https:/ / www. cyberforum. ru/ blogs/ 359708/ 10838. html Задача: . . .
Саморегулирующийся социальный контракт для сервера cross-section.
Hrethgir 14.08.2026
С кодом конечно таких глубоких размышлений пока не было, впрочем я уже привык к алгоритмизации. Суть предмета записи: снова в диалоге с нейросетью (я взял пока себе ник для учётки админа - Rector). . . .
Часы электронные
Uhbif79 12.08.2026
Выкладываю программу часов. Программа позволяет: 1. Использовать системное время и дату, 2. Есть возможность вводить время и дату вручную. 3. Реализованы 2 будильника: начало и конец рабочего дня. . . .
Часы с будильником на основе класса QLCDNumber
Uhbif79 12.08.2026
Всем добрый день, выкладываю программу часов с будильником на основе класса QLCDNumber. Здесь я пробовал самостоятельно создавал классы, впервые столкнулся с видимостью переменной одного класса из. . .
Установка MinGW GCC 16.2 и CMake
8Observer8 10.08.2026
VK Видео: https:/ / vkvideo. ru/ video-240781534_456239017 YouTube: eY5-5PyI9NM Текстовая версия
Неделя из жизни имитационной модели склада: мои кривые руки растут, откуда надо
anaschu 10.08.2026
Неделя из жизни имитационной модели склада: как я почти написал неправильную логику и что с этим делать Работаю сейчас над учебно-рабочим проектом: строю в AnyLogic имитационную модель процессов. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru