uFunc0D
не используется (вы теневые аргумент в предложении where
с функцией, которая имеет одинаковое имя)
' '
обозначает символьный символ, он должен содержать один символ. Возможно, вы думаете о строках, и в этом случае ""
- пустая строка.
- Аргументы к
uFunc1D
никак не связаны с входными аргументами x
и y
, поэтому они могут быть разных типов.
Edit:
вы должны использовать аргументы в выражении (справа от знака равенства) для того, чтобы повлиять на тип возвращаемого значения. Ваша декларация в предложении where
содержит uFunc0D
и uFunc1D
. Объявление uFunc0D
затеняет привязку uFunc0D
в аргументе (слева) функции, так что , даже если вы должны указать uFunc0D
в формате rhs, это будет тот, который вы объявили в предложении where, а не аргумент ,
Edit 2:
Вот пример, скажем, вы хотите функцию f :: (a -> b) -> a -> Char
Наивная попытка может быть: f f1 x = ' '
, но это будет иметь тип f :: a -> b -> Char
. Поскольку факт, что f1
должен быть функцией, неизвестен (и на самом деле вы можете передать что-то еще как f1
), и тот факт, что он принимает что-то типа того же типа, что и второй аргумент, также неизвестен.
Вместо этого, если вы делаете: f f1 x = ' ' where _ = f1 x
, тогда тип будет f :: (a -> b) -> a -> Char
. В этом случае компилятор знает, что f1 должен принимать хотя бы один аргумент (поскольку вы применяете его к аргументу), а аргумент должен иметь тип второго аргумента (поскольку вы применяете его ко второму аргументу).
Edit 3:
Слово о синтаксисе Haskell.
Функция декларации выглядит следующим образом: f arg1 arg2 = expr
, что входит в положение arg1
и arg2
являются образцами. то, что происходит в expr
, являются выражениями.
если вы видите что-то вроде
f x = y
where y = x + 1
, что предшествует пункт where
это выражение, и то, что следует за ним в декларации видны в выражении. Символы новой строки перед маркером where
несущественны, вышесказанное идентично f x = y where y = x + 1
.
Что такое шаблоны? Шаблоны позволяют разлагать значение на части и связывать детали с именами.
x
- это шаблон, в id x = x
, например. Это означает, что x
привязан к первому аргументу id
. x
с правой стороны - не шаблон, а выражение, одно со значением x
, которое было связано с шаблоном с левой стороны.
(a, b)
- другой рисунок, как в fst (a, b) = a
. Этот шаблон указывает, что тип ввода должен быть 2-кортежем, причем первый элемент привязан к a
, а второй привязан к b
.
В mkPair a b = (a, b)
, (a, b)
это выражение, а не образец. Это выражение, которое имеет значение 2-кортежа, первым элементом которого является a
(связанный как первый аргумент в левой части), и второе значение b
(связанное как второй аргумент с правой стороны).
Позиции аргумента функции всегда являются шаблонами, шаблоны могут выглядеть как выражения, но это не так! Является ли какой-то бит кода выражением или шаблоном, определяется тем, где он появляется по отношению ко всему остальному, а не по тому, как он выглядит.
Вместо того, чтобы бросать синтаксис на стену и видеть, какие палки, я предлагаю вам изучить синтаксис Haskell. Например, попробуйте [эту главу «Learn You a Haskell») (http://learnyouahaskell.com/syntax-in-functions). В частности, обратите внимание на разницу между шаблонами и выражениями и какие из них идут туда. – hammar