2015-04-06 2 views
0

У меня возникли проблемы с определением функции в Haskell. То, что я хочу сделать, это ввести переменную типа EnvV и один из типов Store и возвращать переменную в State типа:Определение функции Haskell

type Variable = String 
type Z = Integer 
type T = Bool 
type State = Variable -> Z 
type Location = Z 
type Store = Location -> Z 
type EnvV = Variable -> Location 

search :: EnvV -> Store -> State 
search envV store = envV(store) 
+1

Функция типа '' EnvV' принимает Variable' а.к.а. 'String', в то время как вы подаете его в' Store'. Пожалуйста, уточните, что вы хотите сделать. – bereal

+1

Несвязанное примечание: Круглые скобки не нужны для приложения-приложения (поэтому вы должны написать 'envV store' вместо' envV (store) '). –

ответ

0

Try соответствия типов:

Вы EnvV что Variable -> Location и Store которого Location -> Z

И вы хотите выход State которого Variable -> Z

Вы можете увидеть связь между ними ? Вы должны устранить Location между ними.

search :: EnvV -> Store -> State 
search envV store = \x -> store (envV x) 

Так как вы хотите Variable на выходе, ввести x, который обозначает, что. Затем примените его к envV, который даст вам Location. Теперь примените это к store, которое даст Z. Это даст вам тип Variable -> Z, который ожидается от вас.

Это можно записать более кратко:

search :: EnvV -> Store -> State 
search envV store = store . envV 
1

Ваш вопрос, кажется, упрощать:

type State = String -> Integer 
type Store = Integer -> Integer 

search :: State -> Store -> State 

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

search state store = store . state 

Или еще проще

search = flip (.) 
0

Тип

search :: EnvV -> Store -> State 

означает

search :: EnvV -> Store -> Variable -> Z 

Таким образом, вы можете использовать

search envV store var = store (envV var) 

, потому что envV var является Location, который затем применяется к store для получения Z.

Обратите внимание, что следующий код является правильным, даже если это немного озадачивает

search :: EnvV -> Store -> State 
search envV store var = store (envV var) 

Это озадачивает, потому что его тип показывает два аргумента, когда код ниже занимает три. Эквивалентный выше код чаще записываются как

search :: EnvV -> Store -> State 
search envV store = \var -> store (envV var) 

так, что даже в определении мы можем найти два аргумента, а значение результата, который на самом деле является функцией типа State который отображает каждую переменную var в его стоимость.

Далее приведенный выше код может быть упрощен для использования оператора композиции функций ., как уже показал @ChrisMartin.

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