Eva*_*oll 2 polymorphism haskell types type-synonyms
这是对前一个问题的跟进; 我得到了一个我不太懂的答案,但接受了.所以我会再问一次.
我仍然不明白这有多大意义:
type Parse a b = [a] -> [(b,[a])]
build :: Parse a b -> ( b -> c ) -> Parse a c
build p f inp = [ (f x, rem) | (x, rem) <- p inp ]
Run Code Online (Sandbox Code Playgroud)
现在,显然,p绑定到类型的第一个参数Parse a b.并且,显然也f与第二个论点有关(b -> c).我的问题仍然是什么inp绑定?
如果Parse a b是[a] -> [(b,[a])]我想到的最后一个问题的类型同义词我可以替换它:
build :: [a] -> [(b,[a])] -> ( b -> c ) -> [a] -> [(c,[a])]
Run Code Online (Sandbox Code Playgroud)
但是,我没有看到这个定义有任何意义:
build p f inp = [ (f x, rem) | (x, rem) <- p inp ]
Run Code Online (Sandbox Code Playgroud)
有人帮助解释类型同义词.
现在,显然,p绑定了Parse a b类型的第一个参数.并且,显然f绑定到第二个参数(b - > c).我的问题仍然是inp绑定到什么?
类型的论点 [a]
如果Parse ab是[a] - > [(b,[a])]的类型同义词,我想从上一个问题我可以替代它:
Run Code Online (Sandbox Code Playgroud)build :: [a] -> [(b,[a])] -> ( b -> c ) -> [a] -> [(c,[a])]
几乎; 你需要为替换加上括号:
build :: ([a] -> [(b,[a])]) -> ( b -> c ) -> ([a] -> [(c,[a])])
Run Code Online (Sandbox Code Playgroud)
因为->是右关联的,你可以删除末尾的括号,但不能在开头删除括号,所以你得到:
build :: ([a] -> [(b,[a])]) -> ( b -> c ) -> [a] -> [(c,[a])]
Run Code Online (Sandbox Code Playgroud)
这应该明显为什么inp有类型[a].
你可以替代 - 但不要忘记括号!那应该是:
build :: ( [a] -> [(b,[a])] ) -> ( b -> c ) -> ( [a] -> [(c,[a])] )
Run Code Online (Sandbox Code Playgroud)
因为函数箭头是右关联的,你可以转储右边的括号集,但至关重要的是你不能丢弃左边的新的括号:
build :: ( [a] -> [(b,[a])] ) -> ( b -> c ) -> [a] -> [(c,[a])]
Run Code Online (Sandbox Code Playgroud)
所以现在当你有这条线时build p f inp,你可以看到:
p :: ( [a] -> [(b,[a])] )
f :: ( b -> c )
inp :: [a]
Run Code Online (Sandbox Code Playgroud)
那么我们可以看到:
p inp :: [(b, [a])]
Run Code Online (Sandbox Code Playgroud)
因此:
x :: b
rem :: [a]
Run Code Online (Sandbox Code Playgroud)
和:
f x :: c
(f x, rem) :: (c, [a])
Run Code Online (Sandbox Code Playgroud)
因此整个列表理解具有类型[(c, [a])]- 它与build应该返回的内容完全匹配.希望有所帮助!