2017-01-17 3 views
1

Мне интересно, есть ли идиома для обработки следующего примера. Это должно быть довольно распространенным явлением, и я не думаю, что вы можете использовать там, где это нужно. Помимо написания двух отдельных случаев, я не знаю, как это сделать.Haskell, Case in a Where

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

type OtherType = { x :: Int, y :: Int, z :: String } deriving (Show) 

data SelectionType = A | B 

myMapper = map foo someMyTypes 

где someMyTypes :: [MyType] и foo является

foo :: SelectionType -> MyType -> OtherType 
foo sel t = [ x t, y t, z t <> something ] 
    where 
    case SelectionType of 
     A -> something = "a selected" 
     B -> something = "b selected" 

Что является лучшим способ справиться с этим вышеприведенным случаем, поскольку вышеупомянутое не компилируется.

ответ

4

Просто переместите уравнение за пределы корпуса.

foo sel t = [ x t, y t, z t <> something ] 
    where 
    something = case sel of 
     A -> "a selected" 
     B -> "b selected" 
+0

Кроме того, вы соглашаетесь на переменную 'sel', а не на имя типа, поскольку @ user7428320 был (неправильно). –

+0

@ AntalSpector-Zabusky Конечно. Я предположил, что и его несколько других ошибок (например, не давая 'foo' аргумент в выражении' map', объявляя 'OtherType' как' type' с синтаксисом записи, давая возвращаемый тип 'OtherType', но значение с список в ...) были введены при написании вопроса. –

+0

К сожалению, не заметил всех из них :-) Просто хотел называть это явно для потенциального преимущества @ user7428320, так как он казался потенциально более связанным с их путаницей! –