2012-06-06 4 views
0

У меня есть эти заявления:пусть с конструктором данных

data SL a = SR (Integer -> (a, Integer)) 
    deriving(Show) 

instance Monad SL where 
    return k = SR (\st -> (k, st)) 

xx::SL Integer 
xx = return 4 

Тогда я:

let SR f = xx 

Теперь у меня есть:

xx :: SL Integer 
f :: Integer -> (Integer, Integer) 

, но я не могу понять, почему. Возможно, мне не хватает синтаксического значения let DATACONSTRUCTOR ...

Вы можете помочь?

+3

Что вы ожидали? –

ответ

8

let SR f = xx означает, что SR f должен быть равен xx. Так,

SR f = xx     -- let 
    = return 4    -- def. xx 
    = SR (\st -> (4, st)) -- def. return 

и, таким образом,

f = \st -> (4, st) -- remove SR on both sides 

, который в данном контексте, относится к типу Integer -> (Integer, Integer) из SR :: a -> Integer -> (a, Integer) и xx :: SL Integer.

5

let и where также являются образцовыми совпадениями, например case, но только с одной альтернативой. Так, например, в let выражение:

let SR f = xx in ... 

подобно следующему выражению: case

case xx of 
    SR f -> ... 

Большинство людей просто использовать let и where сделать простой привязки переменных, так что они не понимают, что они совпадения моделей. Однако привязка переменной является лишь особым случаем соответствия шаблону (идентификатор в совпадении с шаблоном соответствует всем и привязывает значение к переменной).

Кроме того, для большинства совпадений моделей требуется более одной альтернативы, поэтому let не применяется. Даже если вы хотите только соответствовать конкретному конструктору, выполнение неполного совпадения шаблонов - не очень хорошая идея. Однако есть определенные случаи, когда одна альтернатива является полным совпадением, например, соответствие кортежа (x, y) или, как в вашем случае, тип данных с одним конструктором.

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