Компьютерный форум
Правила
Вернуться   Компьютерный форум > Форум программистов > Языки программирования > Haskell
Перезагрузить страницу Определите корректную функцию diff
Ответ
 
Опции темы Опции просмотра
  (#16 (permalink)) Старый
calabi-yau calabi-yau вне форума
Member
 
Сообщений: 338
Сказал(а) спасибо: 0
Поблагодарили 10 раз(а) в 10 сообщениях
Регистрация: 28.09.2009
По умолчанию 02.12.2010, 18:47

Цитата:
Сообщение от marinevladi Посмотреть сообщение
А могли Вы и мне помочь с выше описанным типом expr:
1. как в консоли использовать функции "diff" и "eval", что-то не получается(скорее всего не правильно вызываю, как правильно не пойму...)
Код:
*Main> let expr = Mul (Var "X") (Add (Const' 3) (Var "Y"))
*Main>
*Main> eval [("X", 1), ("Y", 2)] expr
5
*Main> diff "X" expr
Add (Const' 3) (Var "Y")
Цитата:
2.что именно делают функции "flat_expr" и "entries".
Заранее спасибо)))
ерунду.
Цитата:
новый diff. вариант выше громоздок и неверен:
haskell Код:
diff s = simplify . go where
  go expr =
    case expr of
      Var s' | s' == s -> Const' 1
      Add x y -> Add (go x) (go y)
      Mul x y -> Add (Mul (go x) y) (Mul x (go y))
      _ -> Const' 0


Don't fear the Monad
Ответить с цитированием
  (#17 (permalink)) Старый
marinevladi marinevladi вне форума
Новичок
 
Сообщений: 7
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 11.11.2010
По умолчанию 02.12.2010, 19:19

спасибо большое))
Ответить с цитированием
  (#18 (permalink)) Старый
marinevladi marinevladi вне форума
Новичок
 
Сообщений: 7
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 11.11.2010
По умолчанию 07.12.2010, 14:20

Могли бы Вы еще помочь?!!
У препода возник вопрос: Что значит и что делает функция lookup здесь
/// unsafeLookup x t = case lookup x t of Just x -> x
и почему написан case, но не перечисляются возможные варианты значений?
Заранее спасибо))
Ответить с цитированием
  (#19 (permalink)) Старый
calabi-yau calabi-yau вне форума
Member
 
Сообщений: 338
Сказал(а) спасибо: 0
Поблагодарили 10 раз(а) в 10 сообщениях
Регистрация: 28.09.2009
По умолчанию 07.12.2010, 15:09

Цитата:
Что значит и что делает функция lookup здесь
/// unsafeLookup x t = case lookup x t of Just x -> x
ищет значение по ключу в листе пар - (key, element). возвращает Maybe element.
Цитата:
и почему написан case, но не перечисляются возможные варианты значений?
потому как нас не интересует случай не содержащий данных (т.е. Nothing, а следовательно данные некорректны. более того, корректность данных по умолчанию подразумевается). а если интересует, то как-то так:
haskell Код:
eval table = go where
  go expr = case expr of
    Const' n -> Just n
    Var x    -> lookup x table
    Add x y  -> bin_op (+) (go x) (go y)
    Mul x y  -> bin_op (*) (go x) (go y)
 
  bin_op f (Just x) (Just y) = Just (f x y)
  bin_op f _        _        = Nothing


Don't fear the Monad
Ответить с цитированием
  (#20 (permalink)) Старый
marinevladi marinevladi вне форума
Новичок
 
Сообщений: 7
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 11.11.2010
По умолчанию 07.12.2010, 15:37

Еще раз огромное СПАСИБО
Ответить с цитированием
Ads.
  (#21 (permalink)) Старый
marinevladi marinevladi вне форума
Новичок
 
Сообщений: 7
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 11.11.2010
По умолчанию 09.12.2010, 11:24

Возник еще один вопрос:
Что означает go where или go expr и что оно делает к примеру вот здесь Add x y -> bin_op (+) (go x) (go y)?
Спасибо.
Ответить с цитированием
  (#22 (permalink)) Старый
calabi-yau calabi-yau вне форума
Member
 
Сообщений: 338
Сказал(а) спасибо: 0
Поблагодарили 10 раз(а) в 10 сообщениях
Регистрация: 28.09.2009
По умолчанию 09.12.2010, 15:28

Цитата:
Сообщение от marinevladi Посмотреть сообщение
Возник еще один вопрос:
Что означает go where
where - ключевое слово. объявляет блок связываний:
haskell Код:
eval table = go
    where
       {связывания}
Цитата:

или go expr
go expr = ... - объявление функции, точнее связывание имени go с лямбдой \expr -> case expr of ...

Цитата:
и что оно делает к примеру вот здесь Add x y -> bin_op (+) (go x) (go y)?
рекурсивно вызывает себя.


Don't fear the Monad
Ответить с цитированием
  (#23 (permalink)) Старый
екатерина201110 екатерина201110 вне форума
Новичок
 
Сообщений: 2
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 11.12.2011
По умолчанию очень нужна помощь! - 11.12.2011, 00:31

В современных web- магазинах часто продают книги, видеокассеты и компакт диски. База данных такого магазина для каждого типа товаров должна содержать следующие характеристики
*книги - название и автор
*видеокассеты - название
*компакт диск - название, исполнитель и кол-во композиций
1)разработать тип данных Product который может представлять эти виды товаров
2)определить функцию getTitle возвращающую название товара
3)на её основе определите функцию getTitles которая по списку товаров возвращает список названий
4)определите функцию bookAuthors которая по списку товаров возвращает список авторов книг
5)определите функцию lookupTitle::String->[Product]->Maybe Product которая возвращает товар с заданным названием
6)определите функцию lookupTitles::[String]->[Product]->[Product]
Она принимает в качестве параметров список названий и список товаров и для каждого названия извлекает из второго соответствующие товары. Названия которым не соответствуют никакой товар игнорируются. при определении функции обязательно используйте функцию lookupTitle
Ответить с цитированием
  (#24 (permalink)) Старый
Viktusya Viktusya вне форума
Новичок
 
Сообщений: 2
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 13.12.2011
По умолчанию 13.12.2011, 23:56

Доброй всем ночи!!! А не подскажите, что вводить? Заранее спасибо))

[CPP]data STree = Tip | Bin (String, Int) STree STree deriving Show

add (k, v) Tip = Bin (k, v) Tip Tip
add (k, v)(Bin (k1, v1) l r) =
if k > k1 then Bin (k1, v1) l (add (k, v) r)
else Bin (k1, v1) (add (k, v) l) r

find' k Tip = Nothing
find' k (Bin (k1, v1) l r)
| k == k1 = Just v1
| otherwise = find' k (if k > k1 then r else l)

exist k = isJust . find k

toList' Tip = []
toList'( Bin (_, v1) l r) = concat [toList' l, [v1], toList' r] [/CPP][/QUOTE]
Ответить с цитированием
Ads
  (#25 (permalink)) Старый
calabi-yau calabi-yau вне форума
Member
 
Сообщений: 338
Сказал(а) спасибо: 0
Поблагодарили 10 раз(а) в 10 сообщениях
Регистрация: 28.09.2009
По умолчанию 14.12.2011, 17:51

зависит от того, какой результат хотите получить.


Don't fear the Monad
Ответить с цитированием
  (#26 (permalink)) Старый
Viktusya Viktusya вне форума
Новичок
 
Сообщений: 2
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 13.12.2011
По умолчанию 17.12.2011, 01:12

Да любой пример, даже чем проще, тем лучше...
Ответить с цитированием
  (#27 (permalink)) Старый
Olya_ Olya_ вне форума
Новичок
 
Сообщений: 2
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 29.04.2012
По умолчанию 29.04.2012, 17:37

У меня вопрос к calabi-yau: задание значений типа Expr напрямую неудобно, есть файл expr.hs, в котором определена функция parseExpr, преобразующая строку вида : "1+x*y" в соответствующее значение типа Expr. То есть его можно использовать в своей программе, просто добавив в начало import Expr. Я хотела узнать где можно найти этот файл с нужной функцией, и как в этом случае будут выглядеть функции diff, simplify, toString и eval? Заранее спасибо...
Ответить с цитированием
  (#28 (permalink)) Старый
calabi-yau calabi-yau вне форума
Member
 
Сообщений: 338
Сказал(а) спасибо: 0
Поблагодарили 10 раз(а) в 10 сообщениях
Регистрация: 28.09.2009
По умолчанию 29.04.2012, 23:39

Цитата:
Сообщение от Olya_ Посмотреть сообщение
Я хотела узнать где можно найти этот файл с нужной функцией

haskell Код:
module Expr ( parseExpr, Expr(..) ) where

import Text.ParserCombinators.Parsec
import Text.ParserCombinators.Parsec.Expr
import Text.ParserCombinators.Parsec.Token
import Text.ParserCombinators.Parsec.Language
import Control.Applicative ((<*))



data Expr = Const' Integer | Var String | Add Expr Expr | Mul Expr Expr deriving (Show, Eq)


def = makeTokenParser emptyDef


optable = [[op "*" AssocLeft], [op "+" AssocLeft]]          
  where
    op s assoc =
      flip Infix assoc $ do { reservedOp def s; return $ op_map s
                            }
    --
    op_map "*" = Mul
    op_map "+" = Add
     
expr = buildExpressionParser optable $
           parens def expr  <|> Const' `fmap` integer def  <|> Var `fmap` identifier def
       

parseExpr = runParser (expr <* eof)  () ""
Цитата:
Сообщение от Olya_ Посмотреть сообщение
и как в этом случае будут выглядеть функции diff, simplify, toString и eval?
haskell Код:
diff' x = either (error . show) (diff x) . run

simplify' = either (error . show) simplify . run

eval' p = either (error . show) (eval p) . run


Don't fear the Monad
Ответить с цитированием
  (#29 (permalink)) Старый
ahil903 ahil903 вне форума
Новичок
 
Сообщений: 9
Сказал(а) спасибо: 3
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 03.10.2012
По умолчанию 08.10.2012, 22:52

Прошу прощения за глупый вопрос, но, надеюсь, поможете (касательно работы с типом Expr)

В общем, при попытке ввести
haskell Код:
*Main> let expr = Mul (Var "X") (Add (Const' 3) (Var "Y"))
интерпретатор выдаёт:
haskell Код:
ERROR - Syntax error in expression (unexpected end of input)
хотя код тот же, что и у вас
Если ввожу просто
haskell Код:
eval [("X", 1), ("Y", 2)] Mul (Var "X") (Add (Const' 3) (Var "Y"))
то ругается ещё больше :C
С функцией diff то же самое
Помогите, очень нужно разобраться)
Ответить с цитированием
  (#30 (permalink)) Старый
calabi-yau calabi-yau вне форума
Member
 
Сообщений: 338
Сказал(а) спасибо: 0
Поблагодарили 10 раз(а) в 10 сообщениях
Регистрация: 28.09.2009
По умолчанию 09.10.2012, 22:03

Цитата:
Сообщение от ahil903 Посмотреть сообщение
интерпретатор выдаёт: haskell Код: ERROR - Syntax error in expression (unexpected end of input) хотя код тот же, что и у вас
хм, Hugs используете?
Цитата:
Сообщение от ahil903 Посмотреть сообщение
eval [("X", 1), ("Y", 2)] Mul (Var "X") (Add (Const' 3) (Var "Y"))
тут компилятор думает что вы пытаетесь передать аргументы неподходящих типов. Исправить можно расставив скобки:
haskell Код:
eval [("X", 1), ("Y", 2)] (Mul (Var "X") (Add (Const' 3) (Var "Y")))
или применить функцию аппликации $:
haskell Код:
eval [("X", 1), ("Y", 2)] $ Mul (Var "X") (Add (Const' 3) (Var "Y"))


Don't fear the Monad
Ответить с цитированием
Пользователь сказал cпасибо:
ahil903 (10.10.2012)
Ответ

Опции темы
Опции просмотра

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

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Trackbacks are Вкл.
Pingbacks are Вкл.
Refbacks are Выкл.


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Определите функцию getTitle , возвращающую название товара sheldon Haskell 5 16.12.2011 12:26
Определите функцию APPEND, объединяющую два списка dudy Lisp 7 17.05.2011 22:53
Определите функцию, переворачивающую список deman Lisp 5 06.05.2011 16:37
Определите рекурсивную функцию MBR Pavel123 Lisp 0 20.12.2010 17:58
Определите функцию (f s), которая вычисляет список mario[x] Lisp 4 09.12.2010 15:37
Определите функцию (FIB N), вычисляющую N-й элемент последовательности Фибоначчи PATRI0T Lisp 4 08.11.2010 17:24
Определите функцию, удаляющую заданный элемент из списка Жасмин Lisp 1 26.10.2010 21:42
Определите функцию, зависящую от двух аргументов u и v lenochka90 Lisp 1 24.09.2010 14:21
Определите функцию, принимающую на вход целое число n AntiSemit Haskell 2 18.12.2009 17:54
Определите функцию (LINEN n), печатающую n раз квадрат 2*2 звездочками Чебурашка Lisp 1 12.12.2009 16:45
Определите функцию, зависящую от одного аргумента MaMasha Lisp 3 24.11.2009 13:44
С помощью предложений COND или CASE определите функцию imported_Irinka Lisp 2 15.05.2004 11:05



Powered by vBulletin® Version 3.8.7
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd.
Нardforum.ru - компьютерный форум и программирование, форум программистов