2013-03-31 3 views
9

В школе exerciceшаблон соответствия в GHCi

У меня есть эта функция

bar :: Float -> Float -> Float 
bar x 0 = 0 
bar 0 y = 0 
bar x y = x * y 

I типа его в GHC, как

let bar x 0 = 0; bar 0 y = 0; bar x y = x * y 

и оценить

bar foo 0 
bar 0 foo 

Я попросил изменить бар, чтобы использовать '|' так что я хочу сделать что-то вроде:

let bar x y = | x 0 = 0 | 0 y = 0 | x y = x * y 

но в GHCI я получил

parse error on input '=' 

Как я могу это сделать в GHCi? Будет ли что-то менять с помощью сопоставления шаблонов ('|')?

+1

Ваш оригинальный 'bar' использует соответствующий шаблон.Вы хотите узнать о [охранниках] (http://en.wikibooks.org/wiki/Haskell/Truth_values#Guards). – dave4420

+2

Вы можете быть особенно умны и писать просто 'let bar | в противном случае = (*) '... – leftaroundabout

+3

Удалите' = 'перед первым защитником' let bar x y | x == 0 = ... | y == 0 = ... | иначе = ... '. –

ответ

16

Посмотрите на синтаксис для использования охранниками:

bar x y | x == 0  = 0 
     | y == 0  = 0 
     | otherwise = x * y 

Написано на одной линии в GHCi:

let bar x y | x == 0 = 0 | y == 0 = 0 | otherwise = x * y 
9

Используйте файлы

Не вводите свой код непосредственно в GHCI если это действительно не однострочный.

Сохраните код в текстовом файле PatternMatch.hs и загрузите его в ghci, набрав.

:l PatternMatch.hs 

, а затем, если вы сделаете изменения (и сохранить), вы можете загрузить файл в GHCI набрав

:r 

В качестве альтернативы, можно назвать файлы, после чего осуществляют они находятся, или просто reusablle Temp.hs, если это действительно код throwaway.

Сохраняя материал в текстовом файле, вы делаете его гораздо более легко редактируемым и многоразовым.

Модулей

Позже вы будете собирать соответствующие функции вместе с помощью правильного модуля, поэтому они могут быть импортером в другие программы. Например, вы могли бы

module UsefulStuff where 

pamf = flip fmap 

сохраняются в файле с именем UsefulStuff.hs, а затем в другом файле вы можете

import UsefulStuff 

, а затем использовать функции из UsefulStuff там.

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

+0

Добро пожаловать в 21-й век. Файлы находятся в шкафу с медной ручкой. В этот день и в возрасте, когда классные дети набрасывают свой код в JSFiddle и набрасываются на кнопку Run или шатаются в песочнице Swift для мгновенного удовлетворения, этот ответ не собирается побеждать многих потенциальных программистов Haskell. По-настоящему классные дети, вероятно, переходят к [Shen] (http://www.shenlanguage.org/), где они могут иметь все функциональное программирование и проверку типов, которые они хотят, а затем некоторые. И да, у него есть REPL, который позволяет многострочный ввод «из коробки», тип подписей и все. – ack

+1

@ack Я думаю, что вы ошибаетесь во мне для человека, который заботится о том, что делают классные дети, тогда как я на самом деле забочусь только о том, чтобы помочь людям максимально использовать инструменты, которые я также использую. Благодарим за спам. – AndrewC

+0

Если вам это очень нравится, возможно, вы могли бы упомянуть [этот ответ] (http://stackoverflow.com/a/8443096/588561), который не требует использования файлов. – ack

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