这是一个简单的函数,它接受一个列表和一个数字,如果列表的长度大于该数字,则可以计算出来.
例如
compareLengthTo [1,2,3] 3 == EQ
compareLengthTo [1,2] 3 == LT
compareLengthTo [1,2,3,4] 3 == GT
compareLengthTo [1..] 3 == GT
Run Code Online (Sandbox Code Playgroud)
请注意,它有两个属性:
import Data.Ord
compareLengthTo :: [a] -> Int -> Ordering
compareLengthTo l n = f 0 l
where
f c [] = c `compare` n
f c (l:ls) | c > n = GT
| otherwise = f (c + 1) ls
Run Code Online (Sandbox Code Playgroud)
有没有办法只compareLengthTo
使用foldr
?
请注意,这里有一个版本的compareLengthTo
使用drop
:
compareLengthToDrop :: [a] -> …
Run Code Online (Sandbox Code Playgroud) 我已经简化了我需要的一些代码的类型签名,它看起来大致如下:
Functor f => f (Maybe a, b) -> (Maybe (f a), f b)
Run Code Online (Sandbox Code Playgroud)
我可以,我该如何实现这样的功能?如果是这样,怎么样?我猜想我需要将仿函数推向使用Traversable
,但是我无法将这一切都放在我脑海中.
根据标题,我希望编写一个具有以下签名的函数。
g :: (Proxy a -> s) -> Proxy (Maybe a) -> Maybe s
g f x = ...
Run Code Online (Sandbox Code Playgroud)
对于我的用例来说,f
是symbolVal
. 我可以symbolVal
在平原上运行KnownSymbol a => a
,但我无法让它工作KnownSymbol a => Maybe a
。
可以说我有以下内容:
class C a where
f :: a -> Blah
f_impl_for_d :: D a => a -> Blah
f_impl_for_d = _
newtype Alice f a = Alice (f a)
Run Code Online (Sandbox Code Playgroud)
也许一些现有的实例是这样的:
instance C a => C [a] where ...
instance C a => C (Identity a) where ...
instance C a => C (Maybe a) where ...
Run Code Online (Sandbox Code Playgroud)
我想要的是这样的实例:
instance (D a, C a => C (f a)) => C (Alice f a)
Run Code Online (Sandbox Code Playgroud)
就像,只要D a
有效,并且有一个C (f a)
带有约束的实例 …
是否有一个函数说f
(在基本Perl或库中),这样:
f("/a/b/c", "./d") == "/a/b/c/d"
f("/a/b/c", "../d") == "/a/b/d"
f("/a/b/c", "/d") == "/d"
Run Code Online (Sandbox Code Playgroud)
基本上,它返回重复生成的目录cd
.
只是putChar
我可以做这样的事情:
f =
do
putChar 'a'
putChar 'b'
g
putChar 'f'
putChar 'g'
g =
do
putChar 'c'
putChar 'd'
putChar 'e'
Run Code Online (Sandbox Code Playgroud)
当我"跑"这个(通过说main = f
)时我会发现它只是按顺序打印出来的字符.
我正在寻找的是非IO
版本.有点像这样的东西:
f =
do
append 'a'
append 'b'
g
append 'f'
append 'g'
g =
do
append 'c'
append 'd'
append 'e'
Run Code Online (Sandbox Code Playgroud)
而且还有一个功能 runAppend :: t a -> [a]
这样runAppend f
=['a','b','c','d','e','f','g']
当然,我希望它在线性时间内运行(即不会遇到类似于++
以错误顺序进行连接的问题).
这似乎是一个相当常见的用例,所以我猜它存在,如果有人能指出我会那么好,我不想重新发明轮子.
请执行功能:
composeApplicative :: (Applicative f) => f (b -> c) -> f (a -> b) -> f (a -> c)
Run Code Online (Sandbox Code Playgroud)
这样:
(composeApplicative f g) <*> x == f <*> (g <*> x)
Run Code Online (Sandbox Code Playgroud)
或者,解释为什么不能这样做?