2016-11-07 2 views
-3

1) Я пытаюсь написать функцию, которая вычисляет среднее из трех чисел я написал что-то вроденаписание средней функции в Haskell

average :: (Float,Float,Float) -> Float 
average x y z = (x+y+z)/3 

, но он не будет работать по какой-то причине

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

2) Я получил эту среднюю функцию из учебника, но когда я попытался запустить его

average :: [Int] -> Rational 
    average [] = error "empty list" 
    average xs = toRational (sum xs)/toRational(length xs) 

, например, если я вошел в среднем [1..5] в компиляторе выход стал 3% 1, он не печатает среднее значение.

+3

Первая функция должна быть 'средняя (х, у, г) = ..' или' средняя :: Поплавок -> Поплавок -> Поплавок -> Float'. Вторая функция работает. Среднее значение «[1..5]» на самом деле равно 3. Рациональное число 3 печатается как «3% 1» (или 3 более 1) в Haskell. – user2407038

+1

@ user2407038 Это ответ, а не комментарий. – chepner

ответ

0
  1. Есть два способа вы могли бы написать функцию 3 номера:

    • функция с 3 параметрами, каждый из параметров 1 номер
    • функции с 1 параметром, параметр 3 числа (а кортеж из 3 номеров)

    Либо это хорошо, но вы их смешивания.

    а) 3 параметра:

    average_3_params :: Float -> (Float -> (Float -> Float)) 
    average_3_params x y z = (x+y+z)/3 
    

    Как читать это: average_3_params является функцией от Float к функции 2-х параметров, и так далее (заметим, что скобка в типе не являются обязательными, Я просто педантичен. Float -> Float -> Float -> Float эквивалентен).

    б) параметр Кортеж

    average_tuple :: (Float, Float, Float) -> Float 
    average_tuple (x, y, z) = (x+y+z)/3 
    

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

  2. 3 % 1 - средний балл [1..5]. Обратите внимание, что ваша функция возвращает Rational, а не Float. A Rational - это доля: прочитайте % как разделительную панель.

Пара примечаний стороны. Хотя а) сначала кажется немного странным, он оказывается очень удобным, поскольку он дает вам частичное приложение (currying) бесплатно. Что касается Float, вероятно, вы должны использовать Double [0].

[0] https://wiki.haskell.org/Performance/Floating_point

Смежные вопросы