Haskell: Какой тип этой функции? - PullRequest
2 голосов
/ 05 апреля 2010
mifun s = foldr op 0 s
          where op x r = head x + r 

Есть ли способ заставить ghci сказать мне?

Ответы [ 2 ]

11 голосов
/ 05 апреля 2010

попробуй :t mifun (сокращение от :type mifun)

, что дает

*Main> :t mifun
mifun :: (Num b) => [[b]] -> b

Итак, для b экземпляра num, mifun берет список списков b и выводит один b (который в этом случае является суммой первых элементов списки).

2 голосов
/ 05 апреля 2010

Это не совсем ответ, но мне нужно было отформатировать.

N.B.: 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 

Я бы предпочел первое.

...