Объявление типа функции в Haskell (GHCI)? [Дубликат]

Вы также можете попробовать следующее:

  JFileChooser c = new JFileChooser ();  c.showOpenDialog (с);  Файл write_file = c.getSelectedFile ();  String Content = "Запись в файл";  // то, что вы хотели бы добавить в файл try {RandomAccessFile raf = new RandomAccessFile (write_file, "rw");  long length = raf.length ();  //System.out.println(length);  raf.setLength (длина + 1);  // + (целочисленное значение) для расстояния raf.seek (raf.length ());  raf.writeBytes (содержание);  raf.close ();  } catch (Исключение e) {// любой метод обработки исключений для выбора ur}  
99
задан hammar 9 December 2011 в 11:00
поделиться

3 ответа

В большинстве случаев вы можете положиться на вывод типа для разработки подписи для вас. В вашем примере достаточно:

Prelude> let addTwo x y = x + y

Если вам действительно нужно определение с сигнатурой типа, или ваше определение охватывает несколько строк, вы можете сделать это в ghci:

Prelude> :{
Prelude| let addTwo :: Int -> Int -> Int
Prelude|     addTwo x y = x + y 
Prelude| :}
Prelude> addTwo 4 7
11

Обратите внимание, что вы также можете сжать это на одну строку:

Prelude> let addTwo :: Int -> Int -> Int ; addTwo x y = x + y

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

135
ответ дан Nicolas Wu 16 August 2018 в 01:56
поделиться
  • 1
    Большое спасибо за оба решения. Но у меня есть еще один смежный вопрос: почему четыре ведущие пробелы требуются во второй строке (до addTwo)? И это должно быть точным, если есть меньше или больше пробелов, тогда возникает ошибка. – R71 9 December 2011 в 14:26
  • 2
    @Rog let начинает блок; записи в блоке сгруппированы по отступу; и первый не-пробельный символ в блоке устанавливает отступ, с помощью которого они группируются. Поскольку первый символ без пробелов в блоке let выше a в addTwo, все строки в блоке должны быть отступом точно так же глубоко, как a. – Daniel Wagner 9 December 2011 в 14:40
  • 3
    Благодарю. Я также заметил, что в других блоках let / where. Это большое отличие от других языков, где игнорируются пробелы, поэтому мне было трудно понять это. – R71 10 December 2011 в 13:53

Решите эту проблему, активировав GHCI и набрав :set +m:

Prelude> :set +m
Prelude> let addTwo :: Int -> Int -> Int
Prelude|     addTwo x y = x + y
Prelude| 
Prelude> addTwo 1 3
4

Boom.


Что здесь происходит (и я говорю в основном о вы, человек, ищущий помощь в процессе работы Learn You A Haskell ) - это то, что GHCI - это интерактивная среда, в которой вы меняете привязки имен функций на лету. Вы должны обернуть определения своих функций в блок let, чтобы Haskell знал, что вы собираетесь что-то определить. Свойство :set +m является сокращением для многострочной конструкции :{ кода :}.

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

86
ответ дан adrian 16 August 2018 в 01:56
поделиться
  • 1
    Так просто, но не очевидно. Я хотел кричать на книгу, которую я использовал, чтобы не сказать мне, что на странице 1! – Tim 11 August 2016 в 15:54

Используйте let:

Prelude> :{
Prelude| let addTwo :: Int -> Int -> Int
Prelude|     addTwo x y = x + y
Prelude| :}
Prelude> addTwo 2 3
5
13
ответ дан Stefan Holdermans 16 August 2018 в 01:56
поделиться
Другие вопросы по тегам:

Похожие вопросы: