Haskell: Какой тип этой функции?
Вопрос
mifun s = foldr op 0 s
where op x r = head x + r
Есть ли способ сделать Ghci сказать мне?
Решение
пытаться :t mifun
(Короче для :type mifun
)
который дает
*Main> :t mifun
mifun :: (Num b) => [[b]] -> b
Итак, для b
экземпляр num
, mifun
принимает список списков b
и выводит один b
(который в этом случае является суммой первых элементов списков).
Другие советы
Это не на самом деле ответ, но мне нужно было форматирование.
NB: mifun
⊥ Если какой-либо из содержащихся списков пуст. Например:
> mifun [[3], [5, 8], [], [1, 2, 3]]
*** Exception: Prelude.head: empty list
Если вы хотите получить результат приведенного выше примера, чтобы быть 9 (лечение пустого списка, не вклад в сумму), то вам следует определить OP как один из следующих способов:
mifun s = foldr op 0 s
where op [] r = r
op (x:_) r = x + r
mifun s = foldr op 0 s
where op x r = (if null x then 0 else head x) + r
mifun s = foldr op 0 s
where op x r = sum (take 1 x) + r
Я бы предпочел первое.
Не связан с StackOverflow